확장자의 아이콘과 연결프로그램 조작
Posted 2005/11/01 22:28
여러 프로그램들이 자신에게 속한 데이터파일의 아이콘들을 셋팅해놓고 있다. 한글과 컴퓨터의 한글워드는 문서모양의 아이콘으로, 압축프로그램인 알집은 알모양의 아이콘으로, 빵집은 빵모양의 아이콘으로 파일의 아이콘을 셋팅해놓는다. 또 해당 파일을 열기하면 자동으로 그에 맞게 셋팅되어있는 연결프로그램이 실행된다.
이러한 기능들에 대해 별 관심이 없었는데 막상 나에게 이런 작업들을 해야할 일이 닥쳤다.
그리하여 알아보게 되었다.
주의사항: 이 글은 내가 막무가내로 찾아본 정보이고 내맘대로 생각하고 쓴 글이니 진실이 아닐지도 모른다. -_-;
프로그래머로 일하고 있는 친구들에게 이에 관한 정보를 물어봤다.
잘 모르겠단다. -_-; 한 친구가 주변의 다른 프로그래머에게 또 물어본 후에 나에게 알려준 힌트 하나! 레지스트리의 HKEY_CLASSES_ROOT 를 살펴보라는 것이다. 보면 감이 올꺼라나.
레지스트리를 열고서 HKEY_CLASSES_ROOT 카테고리에 등록된 다른 프로그램들의 확장자 정보를 살펴봤다. 오! 정말 감이 온다! 이 글을 보고 계시는 프로그래머분도 보시면 감이 올것이다. 이미 알고계시는 분들은... GG를 선언한다!
HKEY_CLASSES_ROOT 카테고리를 살펴보면 이런것들도 있었나 할 정도로 수많은 확장자에 대한 정보들이 보인다. 익숙한 확장자의 정보를 보는것이 이해가 빠를것으로 생각되어 zip파일에 대한 정보를 살펴보았다.
기본값에 보면 ALZip.zip 이라는 문자열을 발견할수 있다. 자. 그럼 ALZip.zip의 정보도 찾아보자. 이 정보도 역시 HKEY_CLASSES_ROOT 카테고리에 존재한다. ALZip.zip을 넣고 검색해보자.
여기까지 보고 나면 감이 오기 마련이다.
.zip 키의 기본값에서 아이콘이나 쉘커맨드등의 정보가 있는곳을 알려주고 있다. ALZip.zip의 서브키 DefaultIcon의 기본값에 아이콘 이미지가 어디있는지를 설정할 수 있으며, 서브키 Shell/Open/Command에서 연결프로그램을 설정할 수 있는것이다.
이로써 아이콘을 마음대로 바꾸고 연결할 프로그램도 마음대로 바꿀 수 있게 되었다. 이를 설정할 수 있도록 하는 함수를 작성해보자. 내 손에 가장 익숙한 Delphi로 코딩해본다.
위 함수의 사용은 아래와 같이 한다.
자, 그리고 탐색기를 실행시켜서 .tst 파일들을 살펴보자. 아무런 변화도 없을것이다. 아이콘도 그대로고 연결프로그램도 실행되지 않는다. 레지스트리에 제대로 넣어줬는데 무엇이 문제일까? 아래의 API 함수로 쉘에 이러한 변동사항을 알려줘야한다.
좀더 보강한 확장자 등록함수는 아래와 같다.
이러한 기능들에 대해 별 관심이 없었는데 막상 나에게 이런 작업들을 해야할 일이 닥쳤다.
그리하여 알아보게 되었다.
주의사항: 이 글은 내가 막무가내로 찾아본 정보이고 내맘대로 생각하고 쓴 글이니 진실이 아닐지도 모른다. -_-;
프로그래머로 일하고 있는 친구들에게 이에 관한 정보를 물어봤다.
잘 모르겠단다. -_-; 한 친구가 주변의 다른 프로그래머에게 또 물어본 후에 나에게 알려준 힌트 하나! 레지스트리의 HKEY_CLASSES_ROOT 를 살펴보라는 것이다. 보면 감이 올꺼라나.
레지스트리를 열고서 HKEY_CLASSES_ROOT 카테고리에 등록된 다른 프로그램들의 확장자 정보를 살펴봤다. 오! 정말 감이 온다! 이 글을 보고 계시는 프로그래머분도 보시면 감이 올것이다. 이미 알고계시는 분들은... GG를 선언한다!
HKEY_CLASSES_ROOT 카테고리를 살펴보면 이런것들도 있었나 할 정도로 수많은 확장자에 대한 정보들이 보인다. 익숙한 확장자의 정보를 보는것이 이해가 빠를것으로 생각되어 zip파일에 대한 정보를 살펴보았다.
기본값에 보면 ALZip.zip 이라는 문자열을 발견할수 있다. 자. 그럼 ALZip.zip의 정보도 찾아보자. 이 정보도 역시 HKEY_CLASSES_ROOT 카테고리에 존재한다. ALZip.zip을 넣고 검색해보자.
여기까지 보고 나면 감이 오기 마련이다.
.zip 키의 기본값에서 아이콘이나 쉘커맨드등의 정보가 있는곳을 알려주고 있다. ALZip.zip의 서브키 DefaultIcon의 기본값에 아이콘 이미지가 어디있는지를 설정할 수 있으며, 서브키 Shell/Open/Command에서 연결프로그램을 설정할 수 있는것이다.
이로써 아이콘을 마음대로 바꾸고 연결할 프로그램도 마음대로 바꿀 수 있게 되었다. 이를 설정할 수 있도록 하는 함수를 작성해보자. 내 손에 가장 익숙한 Delphi로 코딩해본다.
procedure RegistFileType(ft, key, prg, icon: string);
var Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
if Reg.OpenKey('' + ft, True) then Reg.WriteString('', key);
if Reg.OpenKey('' + key + 'ShellOpenCommand', True) then Reg.WriteString('', prg);
if Reg.OpenKey('' + key + 'DefaultIcon', True) then Reg.WriteString('', icon);
Reg.Free;
end;
var Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
if Reg.OpenKey('' + ft, True) then Reg.WriteString('', key);
if Reg.OpenKey('' + key + 'ShellOpenCommand', True) then Reg.WriteString('', prg);
if Reg.OpenKey('' + key + 'DefaultIcon', True) then Reg.WriteString('', icon);
Reg.Free;
end;
위 함수의 사용은 아래와 같이 한다.
RegistFileType('.tst', 'test.cld', 'c:프로젝트 est.exe', 'c:프로젝트 est.exe');
자, 그리고 탐색기를 실행시켜서 .tst 파일들을 살펴보자. 아무런 변화도 없을것이다. 아이콘도 그대로고 연결프로그램도 실행되지 않는다. 레지스트리에 제대로 넣어줬는데 무엇이 문제일까? 아래의 API 함수로 쉘에 이러한 변동사항을 알려줘야한다.
void SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);
좀더 보강한 확장자 등록함수는 아래와 같다.
// 확장자를 레지스트리에 등록한다.
// ft: 파일확장자, key: 파일확장자에 대한 키, prg: 프로그램, icon: 아이콘
procedure RegistFileType(ft, key, prg, icon: string);
var Reg: TRegistry;
begin
// ft에 .이 없다면 붙여줌
if Copy(ft, 1, 1) <> '.' then ft := '.' + ft;
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
// 확장자 기록
if Reg.OpenKey('' + ft, True) then Reg.WriteString('', key);
// 실행커맨드 기록
if Reg.OpenKey('' + key + 'ShellOpenCommand', True) then Reg.WriteString('', prg+' "%1"');
// 확장자에 대한 아이콘 기록
if Reg.OpenKey('' + key + 'DefaultIcon', True) then Reg.WriteString('', icon);
Reg.Free;
// 쉘에 통보
SHChangeNotify(SHCNE_ASSOCCHANGED, HCNF_FLUSH, nil, nil);
end;
// ft: 파일확장자, key: 파일확장자에 대한 키, prg: 프로그램, icon: 아이콘
procedure RegistFileType(ft, key, prg, icon: string);
var Reg: TRegistry;
begin
// ft에 .이 없다면 붙여줌
if Copy(ft, 1, 1) <> '.' then ft := '.' + ft;
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
// 확장자 기록
if Reg.OpenKey('' + ft, True) then Reg.WriteString('', key);
// 실행커맨드 기록
if Reg.OpenKey('' + key + 'ShellOpenCommand', True) then Reg.WriteString('', prg+' "%1"');
// 확장자에 대한 아이콘 기록
if Reg.OpenKey('' + key + 'DefaultIcon', True) then Reg.WriteString('', icon);
Reg.Free;
// 쉘에 통보
SHChangeNotify(SHCNE_ASSOCCHANGED, HCNF_FLUSH, nil, nil);
end;