a. 분류
쉘 확장에서는 동작 방식에 따라서 크게 두가지로 나뉘는데, 즉 file class 와 관계가 있는 것과, 관계가 없는것으로 나뉜다.
ㅇ 관계 있는 것 ( 핸들러명 – 관련 인터페이스명 : 용도 )
Shortcut menu handler – IContextMenu : 컨텍스트 메뉴 제어하기
Data handler – IDataObject : 드레그앤드랍 이후의 액션 제어하기 ( 일반 쉘객체의 드레그앤드랍 액션에 대한 반응을 정의함 )
Drop handler – IDropTarget : 드레그앤드랍 이후의 액션 제어하기 ( 데이터 객체의 드레그앤드랍 액션에 대한 반응을 정의함 )
Icon handler – IExtractIcon : 기본 아이콘을 바꾸고자 할 때 사용
Property sheet handler – IShellPropSheetExt : 파일에서의 속성창 추가하기
Thumbnail Image handler – IExtractImage : 섬네일 뷰 제어
Infotip handler – IQueryInfo : 풍선도움말 제어
Metadata handler – IPropertySetStorage : 탐색기에서 자세히 보기 제어
ㅇ 관계 없는 것 ( 핸들러명 – 관련 인터페이스명 )
Column handler – IColumnProvider : 자세히 보기에서 컬럼 제어
Copy hook handler – ICopyHook : 폴더나 프린터 객체가 이동,복사,삭제,변경될때 관여함
Drag-and-drop handler – IContextMenu : 마우스 우측으로의 드레그앤드랍( 컨텍스트 메뉴 제어하기 )
Icon Overlay handler – IShellIconOverlayIdentifier : 아이콘 제어
Search handler : 검색엔진 제어
b. 기본 인터페이스
쉘 확장시 각각마다 관련된 인터페이스를 상속받아 메소드를 구현해주면 되는데, 추가로 다음 두 인터페이스가 경우에 따라 필요할 때가 있다.
IPersistFile , IShellExtInit
이 두 인터페이스는 쉘 확장을 할 때 상황에 따라서 추가로 상속받아 줘야 되는 인터페이스들인데, IPersistFile 인터페이스의 경우는 디스크로부터 객체를 얻거나 저장하는데 쓰이는 목적이 있고, IShellExtInit 인터페이스의 경우는 쉘 확장을 초기화하는데 쓰인다.
결과적으로 말해서 다음과 같은 확장을 할 때는 추가로 상속해 줘야 한다.
ㅇ IPersistFile 상속이 필요한 경우
Icon handlers
Data handlers
Drop handlers
ㅇ IShellExtInit 상속이 필요한 경우
Shortcut menu handlers
Drag-and-drop handlers
Property sheet handlers
c. 특정 파일에서 마우스 오른쪽 버튼 눌렀을 때의 메뉴를 제어하기
ㅇ 구현 인터페이스 : IContextMenu , IShellExtInit
ㅇ 구현 메소드 ( IContextMenu )
- GetCommandString : 메뉴에 관한 정보 문자열을 알려주는 역할 ( 메뉴에 마우스를 갖다댔을 때 상태창에 뜨는 정보 ). 호출될 때 OS의 언어정보까지 넘어가는데, 이 유형에 맞게 정보를 output 인자에 실어줘야 한다.
- InvokeCommand : 메뉴가 선택되었을 때의 처리 프로시져 역할을 함.
- QueryContextMenu : 메뉴가 펼쳐질 때 호출되어 메뉴 조작을 할 수 있도록 함
d. 특정 아이콘을 오버레이 시키기
ㅇ 구현 인터페이스 : IShellIconOverlayIdentifier
ㅇ 동작 흐름
쉘이 구동할 때 모든 아이콘 오버레이 핸들러가 초기화가 되는데, 이때IShellIconOverlayIdentifier의 두 메서드가 관여하게 된다.
쉘이 아이콘 오버레이 핸들러의 위치정보를 알고자 할 때 GetOverlayInfo 메서드를 호출하게 되는데, 아이콘 오버레이 핸들러는 오버레이 이미지를 포함하고 있는 파일의 이름과 그 파일에서의 인덱스를 반환하게 된다. 쉘이 이 정보를 바탕으로 시스템 이미지 리스트에 아이콘 오버레이를 등록하게 된다.
만약, 아이콘을 오버레이 시키려고 보니까 여러개가 오버레이 되어야 되는 경우가 생길 수 있는데 이때는 우선순위에 따라서 그려지는것이 결정이 되는데, 이때 GetPriority 메서드가 호출되어 우선순위 정보를 얻어가게 된다. 우선순위는 0~100까지의 수로 기록이 되며 숫자가 커질 수록 우선순위가 떨어지게 된다.
( 쉘이 아이콘을 그리기 전에, 쉘은 객체의 이름을 가지고 각각의 아이콘 오버레이 핸들러의IsMemberOf 메서드를 호출한다. 호출받은 아이콘 오버레이 핸들러 입장에서 해당 아이콘을 표시하는데 자신이 관여해야 한다면 S_OK를 반환하고, 자신이 관계없는 아이콘이라면 S_FALSE를 반환하게 된다. )
ㅇ 구현 메소드( IShellIconOverlayIdentfier )
- GetPriority : output 인자로 우선순위를 넘겨주는데 보통 0으로 넘겨준다.
- IsMemberOf : 인자로 파일경로와 파일의 속성 정보가 넘어오는데, 이 정보를 바탕으로 자신이 표시되어야 한다면 S_OK를 반환하고, 관계 없다면 S_FALSE 를 반환하면 된다.
- GetOverlayInfo : 자신의 모듈명과 관련된 아이콘 리소스 인덱스 정보를 알려준다.
e. 속성 페이지에 원하는 탭을 추가 / 교체 하기
ㅇ 구현 인터페이스 : IShellPropSheetExt , IShellExtInit
ㅇ 동작 흐름
속성창이 뜨는 순간, 쉘은 해당 파일 타입에 등록된 모든 property sheet handler에서AddPages 메서드를 호출하게 된다.
ㅇ 구현 메소드( IShellPropSheetExt )
- AddPages : 추가할 속성탭 정보를 담고 있는 구조체( PROPSHEETPAGE )를 생성하여 생성시켜준다.
- ReplacePage : 역시 PROPSHEETPAGE 구조체를 이용해서, 기존에 존재하는 탭을 구조체가 가리키는 탭으로 교체를 한다.
( PROPSHEETPAGE 구조체 : 탭으로 쓰일 다이얼로그 , 아이콘 정보를 담고 있고, 다이얼로그를 처리할 프로시져 함수 및 Callback 함수 정보도 포함하고 있어서, 개발 시 이 함수 구현도 필요하다. )
[출처] Shell Extension 정리|작성자 김기용
참고: https://msmvps.com/blogs/gdicanio/archive/2010/01/11/shell-extensions-tutorials.aspx
'Programming > Windows API' 카테고리의 다른 글
[퍼온글] 프로세스 보호 기술 (0) | 2012.01.11 |
---|---|
다중실행방지 (0) | 2011.12.05 |