본문 바로가기

windows

포터블 프로그램 우클릭 메뉴

일반적인 사용자가  우클릭 메뉴를 레지스트리에 등록할 할때 shell 키를 이용하여 등록합니다.
예를 들어 .txt 파일에 관련된 응용프로그램을 등록할 경우 다음과 같은 형식입니다.

[HKEY_CLASSES_ROOT\txtfile\shell\MyApp]
@="테스트 입니다."
[HKEY_CLASSES_ROOT\txtfile\shell\MyApp\command]
@="D:\\Test\\MyApp.exe \"%1\"" --> 보기 쉽게하면 D:\Test\MyApp.exe %1 입니다.

위와 같은 방식 이외에 응용프로그램을 설치하면 다른 방식을 이용해 우클릭메뉴에 등록하는 경우가 있습니다.

레지스트리를 아무리 검색해 보아도 '압축파일에 추가, 압축해서 이메일 보내기...등등'을 찾을 수 없습니다.

알고 보니, DLL 파일을 이용한 우클릭 메뉴 등록 방법이 따로 있습니다.

첫번째의 shell 키를 이용해 등록하는것을 Static Shortcut Menu 라 부르고, 두번째의 DLL 파일을 이용해 등록하는 것을 Dynamic Shortcut Menu 라고 부릅니다. Shortcut Menu = Context Menu = 우클릭 메뉴 입니다.

DLL 파일을 이용해 등록하는 경우는 shell 키가 아닌 shellex\ContextMenuHandlers 키를 사용합니다.

7-Zip 을 예로 들면,

[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\7-Zip]
@="{23170F69-40C1-278A-1000-000100020000}"

 

--> * 은 모든 파일을 의미합니다. 모든 파일에 위 우클릭 메뉴를 사용할 때의 경로입니다.

 경로 마지막의 7-Zip 이라는 키 이름은 임의적으로 변경 가능한데 이름을 변경한다 하더라도 우클릭 메뉴에 변경된 이름이

표시되는 것은 아닙니다. 위에 나타난 우클릭 메뉴는 전적으로 DLL 파일 내부에 규정된대로 나타납니다. 물론 환경설정에서

우클릭 메뉴에 대한 설정을 변경할 수 있는데 이 부분은 [HKEY_CURRENT_USER\Software\7-Zip] 경로에 관련 설정이 등록되어 제어가 이루어 집니다.( 별개의 문제입니다.)

{23170F69-40C1-278A-1000-000100020000} 는 7-Zip의 고유한 CLSID (Class Iidentifier: 클래스 식별자) 입니다. 마찬가지로

 DLL 파일 내부적으로 규정되어 있고 임의적으로 할당할 수 없습니다. GUID 형식을 취합니다.

 

[HKEY_CLASSES_ROOT\CLSID\{23170F69-40C1-278A-1000-000100020000}\InprocServer32]
@="D:\\7-Zip\\7-zip.dll"

"ThreadingModel"="Apartment"

 

--> 처음에 ContextMenuHandlers의 7-Zip 키에 CLSID 값을 지정했으므로, 이 번에는 CLSID 값에 구체적인 정보를 지정해 줍니다. 구체적인 정보라 해봐야 7-zip.dll 파일의 경로를 지정해 주는 것 뿐입니다. (그 외에는 하나의 정형화된 형식입니다.)

이 두가지 레지스트리를 등록해주면 7-Zip 의 우클릭 메뉴를 사용할 수 있습니다. 생각보다 간단합니다.^^

추가로 위에서 모든 파일의 경로에만 등록했으므로 디렉토리 우클릭에서도 사용하려면 * 을 directory 로 바꾸어서 추가로 등록해야 사용할 수 있습니다.

CLSID 값이나, 우클릭 메뉴를 담당하는 파일이 어떠한 파일인가는 실제로 설치를 해본다음 7-Zip 으로 검색하여 ContextMenuHandlers\7-Zip 키를 찾아서 CLSID 값을 찾고  다시 CLSID 값을 검색하여 등록된 DLL 파일을 찾아서 알 수 있었습니다.

 

CLSID, InprocServer32, ThreadingModel, Apartment  용어들은 저도 잘 모르고 설명하기도 쉽지 안네요.

참조 링크로 대신합니다.-  http://webdizen.new21.net/blog/1872

 

7-zip.dll 파일은 regsvr32.exe 로 레지스트리에 등록할 수 있게 되어 있습니다. 다음은 regsvr32.exe 로 7-zip.dll 파일을 등록했을 때 등록되는 레지스트리입니다.

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}]
@="7-Zip Shell Extension"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}\InprocServer32]
@="D:\\7-Zip\\7-zip.dll"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
"{23170F69-40C1-278A-1000-000100020000}"="7-Zip Shell Extension"

 

위에서 든 예에서는 이중에서 중간 부분만 취해서 사용했습니다. regsvr32.exe 를 이용할 경우 CLSID 부분은 등록되었으니 shellex\ContextMenuHandlers\7-Zip 부분만 등록하면 사용할 수 있습니다.

이에 반해서 UltraISO 같은 경우는 우클릭 메뉴를 담당하는 파일이 isoshl64.dll 인데 regsvr32.exe 로 우클릭에 관련된 모든 레지스트리를 완벽하게 등록합니다.( x64- isoshl64.dll, x86-isoshell.dll 을 사용합니다. 실제 설치 후 레지스트리 검색을 통해 알아 냈습니다.)







마지막 부분 에러 메세지를 해결하기 위해서는 따로 더 등록해 주어야 되는 부분이 있습니다.

 

[HKEY_CURRENT_USER\Software\EasyBoot Systems\UltraISO\5.0]
@="D:\\UltraISO"

 

제가 사용했던 UltraISO 포터블 파일은 %temp% 폴더에 압축을 풀고 실행시키는 방식이었는데 압축을 푼 파일을 복사해서 사용한 것입니다. x86 기반에서 제작된 방식이라 isoshl64.dll 파일이 없어서 따로 설치후 복사해서 사용했습니다. 이 레지스트리를 찾아내는데 고생좀 했는데 알고보니 원본 포터블 파일은 위와 같은 레지스트리를 시작전에 미리 등록하고 시작하는 방식이었습니다.


이번 예는 Beyond Compare 3 라는 비교 유틸입니다.

BCompare.exe 라는 파일만 하나 있는 포터블인데 실행시키면 현재 폴더에 BCompare 폴더를 만들고 필요한 정보를 저장합니다. BCShellEx64.dll 은 원본을 설치해서 복사해온 것입니다. regsvr32.exe 로 레지스트리 등록하는 것을 지원하지 않습니다.

다음과 같이 등록하면 사용할 수 있습니다.

 

[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\CirrusShellEx]
@="{57FA2D12-D22D-490A-805A-5CB48E84F12A}"

[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\CirrusShellEx]
@="{57FA2D12-D22D-490A-805A-5CB48E84F12A}"

[HKEY_CLASSES_ROOT\CLSID\{57FA2D12-D22D-490A-805A-5CB48E84F12A}\InProcServer32]
@="D:\\BCompare\\BCShellEx64.dll"

 "ThreadingModel"="Apartment"



다음은 Hash를 체크할 수 있는 유틸(HashCheck.dll) 에 대한 예입니다.



HashCheckInstall-2.1.11.exe 를 실행해서 설치하면 x64용, x86용 HashCheck.dll 을 System32, SysWOW64 폴더에 각각 설치합니다. 그리고 제작자 정보, 버전 정보등도 추가로 레지스트리 등록합니다. 그 중 System32 폴더에 설치된 HashCheck.dll 파일을 복사해와서 regsvr32.exe로 등록해서 사용할 수 있습니다. regsvr32.exe 보다 레지스트리 등록되는 것을 줄이려면 다음과 같이 등록하면 위 두가지 기능을 사용할 수 있습니다.

 

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\PropertySheetHandlers\HashCheck Shell Extension]
@="{705977C7-86CB-4743-BFAF-6908BD19B7B0}"

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\HashCheck Shell Extension]
@="{705977C7-86CB-4743-BFAF-6908BD19B7B0}"

[HKEY_CLASSES_ROOT\CLSID\{705977C7-86CB-4743-BFAF-6908BD19B7B0}\InprocServer32]
@="D:\\HashCheck\\HashCheck.dll"
"ThreadingModel"="Apartment"

 

첫번째 속성창은 ContextMenuHandlers 대신에 PropertySheetHandlers 키를 사용한다는 점이 다릅니다.

기타 shellex 키에 등록해 사용할 수 있는 Handlers 에 관해서 http://msdn.microsoft.com/en-us/library/cc144110.aspx

를 참조해 보세요.

'windows' 카테고리의 다른 글

윈도우10 내 PC 폴더 3D 개체 삭제 방법  (1) 2020.08.22
netsh 내부 프록시 설정  (0) 2016.10.22
로우 레벨 포멧 유틸리티  (0) 2012.05.10