Programming/Windows API2011. 11. 24. 09:45

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 정리|작성자 김기용

출처 : http://blog.naver.com/PostView.nhn?blogId=galma73&logNo=80105138518&parentCategoryNo=9&viewDate=&currentPage=1&listtype=0

참고: https://msmvps.com/blogs/gdicanio/archive/2010/01/11/shell-extensions-tutorials.aspx

'Programming > Windows API' 카테고리의 다른 글

[퍼온글] 프로세스 보호 기술  (0) 2012.01.11
다중실행방지  (0) 2011.12.05
Posted by Mocker