본문 바로가기

프로그래밍/Delphi

확장자를 이용한 자동실행 처리 방법

1. 개요


  배포한 프로그램에서 로딩하는 특정 확장자를 가진 파일을 로컬 시스템에서 더블클릭 하거나 웹에서 파일을 직접 다운로드 받았을 때 PDF파일의 경우처럼 "열기"를 이용하여 자동으로 해당 프로그램을 실행시켜 다운 받은 프로그램을 로딩하도록 하는 기법을 탐구해 보자.


2. 특정 확장자를 가진 파일을 프로그램에서 파라미터로 로딩 하도록 설정


  근본적으로 확장자를 자동으로 매핑해 놓더라도 어플리케이션에서 실행시 파라미터로 받아들여진 파일을 처리하는 로직이 없다면 도로아미 타불이다. 따라서 어플리케이션에서는 반드시 실행시 전달된 파라미터를 가지고 로딩이 가능하도록 구현이 되어 있어야 한다.



3. 특정 확장자에 대한 어플리케이션 연결


가) 설치 패키지(인스톨쉘드, 이노셋업)에서 설치시 파일 확장자 자동 매핑 기능을 이용하는 방법(여기서는 설명 안함)


나) 프로그램 실행시 레시스트리 등록을 이용한 자동 실행 처리

  - 매번 실행되는 단점이 있으나 이것은 실행시 체크해서 한 번만 실행되도록 하는 것은 개발자의 몫

  - 레지스트리 세팅 방법

  - KEY가 되는 ROOT Registry : HKEY_CLASS_ROOT


다) 도식으로 알아보는 확장자 매핑 자동실행 레지스트리 구성





 * 참고 : 웹에서 파일을 다운로드 받은 후 "열기/저장" 없이 바로 실행시키려면 App Key에 "EditFlag"를 이진 데이터로 "00 00 01 00"으로 등록 하면 됨


4. 프로그램 예제(Delphi Source)



procedure RegisterFileType(cMyExt, cMyFileType, cMyDescription, ExeName: string; IcoIndex: integer; DoUpdate: boolean = false);
var 
   Reg: TRegistry;
   Data: array of Byte;
   mimekey : string;
begin
  Reg := TRegistry.Create;
  try
    mimekey := 'application/x-testapp-' + copy(cMyExt, 2, Length(cMyExt));

    Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.OpenKey(cMyExt, True);
    // 파일 타입을 기록
    // HKEY_CLASSES_ROOT에 확장자를 등록하고, 해당 확장자가 연결될 키 값을 지정
    Reg.WriteString('', cMyFileType);
    Reg.WriteString('Content Type', mimekey);
    Reg.CloseKey;
    // 파일 타입과 관련된 키를 생성한다
    Reg.OpenKey(cMyFileType, True);
    // 등록된 키에 대한 설명 정보 등록
    Reg.WriteString('', cMyDescription);
   // MIME Type에의해 다운로드 후 바로 실행을 위한 "EditFlag" 바이너리값 설정 "00 00 01 00"
    SetLength(Data, 4);
    Data[0] := $00;
    Data[1] := $00;
    Data[2] := $01;
    Data[3] := $00;
    Reg.WriteBinaryData('EditFlag', Data[0], 4);
    Reg.CloseKey;    // Now write the default icon for my file type
    // 해당 확장자를 가진 파일 타입에 지정될 아이콘 번호
    //  \(Default) = 'Application Dir\Project1.exe,0' 
    Reg.OpenKey(cMyFileType + '\DefaultIcon', True); 
    Reg.WriteString('', ExeName + ',' + IntToStr(IcoIndex)); 
    Reg.CloseKey; 
    // 더블클릭시 자동으로 열리게 하기 위한 키 등록
    Reg.OpenKey(cMyFileType + '\Shell\Open', True); 
    Reg.WriteString('', '&Open'); 
    Reg.CloseKey; 
    // 해당 확장자를 가진 파일을 열 실행 파일 경로 등록
    // 해당 파일을 전달받을 파라미터를 "%1" 첫번째 파라미터로 전달 
    Reg.OpenKey(cMyFileType + '\Shell\Open\Command', True); 
    Reg.WriteString('', '"' + ExeName + '" "%1"'); 
    Reg.CloseKey; 

    //MIME Type 설정
    Reg.OpenKey('\MIME\Database\Content Type\' + mimekey, True);
    //해당 마임타입에 해당하는 확장자 등록
    Reg.WriteString('Extension', cMyExt);
    Reg.CloseKey;

    // 레지스트리 설정과 동시에 익스플로러에서 인식할 수 있도록 이벤트 처리
    if DoUpdate then SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
  finally
    Reg.Free;
  end;
end;

// 함수 호출 예제
...
  // .tst, .tsr을 TestApp.exe에 매핑한다
  RegisterFileType('.tst', 'TestApp', '테스트내플그림', 'C:\Program Files\MyApp\TestApp.exe', 0); //.tst를 TestApp.exe에 매핑
  RegisterFileType('.tsr', 'TestApp', '테스트내플그림', 'C:\Program Files\MyApp\TestApp.exe', 0);//.tsr를 TestApp.exe에 매핑
...