파일 형식에 대한 속성 시트 처리기를 등록하고 구현하는 방법
사용자가 파일 형식의 멤버를 마우스 오른쪽 단추로 클릭하여 속성 속성 시트를 표시하면 Shell은 파일 형식에 등록된 속성 시트 처리기를 호출합니다. 각 처리기는 기본 속성 시트에 하나의 사용자 지정 페이지를 추가할 수 있습니다.
알아야 하는 작업
기술
- 셸
사전 요구 사항
- 바로 가기 메뉴 이해
지침
1단계: 파일 형식에 대한 속성 시트 처리기 등록
일반적인 COM(구성 요소 개체 모델) 등록 외에도 파일 형식과 연결된 애플리케이션의 ProgID 키의 shellex 하위 키에 PropertySheetHandlers 하위 키를 추가합니다. 처리기의 이름을 사용하여 PropertySheetHandlers 의 하위 키를 만들고 기본값을 CLSID(속성 시트 처리기 클래스 식별자) GUID의 문자열 형식으로 설정합니다.
속성 시트에 둘 이상의 페이지를 추가하려면 각 페이지에 대한 처리기를 등록합니다. 속성 시트에서 지원할 수 있는 최대 페이지 수는 32개입니다. 여러 처리기를 등록하려면 기본값이 처리기의 CLSID GUID로 설정된 각 처리기의 shellex 키 아래에 키를 만듭니다. 각 처리기에 대해 고유한 개체를 만들 필요는 없습니다. 즉, 여러 처리기가 모두 동일한 GUID 값을 가질 수 있습니다. 페이지는 해당 키가 셸렉스 아래에 나열되는 순서대로 표시됩니다.
다음 예제에서는 예제 .myp 파일 형식에 대해 두 개의 속성 시트 확장명 처리기를 사용하도록 설정하는 레지스트리 항목을 보여 줍니다. 이 예제에서는 각 페이지에 대해 별도의 개체가 사용되지만 두 페이지에 대해 단일 개체를 사용할 수도 있습니다.
HKEY_CLASSES_ROOT
.myp
(Default) = MyProgram.1
CLSID
{Page 1 Property Sheet Handler CLSID GUID}
InProcServer32
(Default) = C:\MyDir\MyPropSheet1.dll
ThreadingModel = Apartment
{Page 2 Property Sheet Handler CLSID GUID}
InProcServer32
(Default) = C:\MyDir\MyPropSheet2.dll
ThreadingModel = Apartment
MyProgram.1
(Default) = MyProgram Application
shellex
PropertySheetHandlers
MyPropSheet1
(Default) = {Page1 Property Sheet Handler CLSID GUID}
MyPropSheet2
(Default) = {Page2 Property Sheet Handler CLSID GUID}
2단계: 파일 형식에 대한 속성 시트 처리기 구현
속성 시트 처리기의 작동 방식에 설명된 일반적인 구현 외에도 파일 형식에 대한 속성 시트 처리기에는 IShellPropSheetExt 인터페이스의 적절한 구현이 있어야 합니다. IShellPropSheetExt::AddPages 메서드만 토큰이 아닌 구현이 필요합니다. 셸은 IShellPropSheetExt::ReplacePage를 호출하지 않습니다.
IShellPropSheetExt::AddPages 메서드를 사용하면 속성 시트 처리기가 속성 시트에 페이지를 추가할 수 있습니다. 메서드에는 두 개의 입력 매개 변수가 있습니다. 첫 번째 lpfnAddPage는 속성 시트에 페이지를 추가하는 데 필요한 정보를 셸에 제공하는 데 사용되는 AddPropSheetPageProc 콜백 함수에 대한 포인터입니다. 두 번째 lParam은 처리기에서 처리되지 않는 셸 정의 값입니다. 콜백 함수가 호출될 때 단순히 셸로 다시 전달됩니다.
AddPages를 구현하는 일반적인 절차는 다음과 같습니다.
AddPages 메서드 구현
-
PROPSHEETPAGE 구조체의 멤버에 적절한 값을 할당합니다. 특히 다음 사항에 주의하십시오.
- 처리기의 참조 수를 보유하는 변수를 pcRefParent 멤버에 할당합니다. 이렇게 하면 속성 시트가 계속 표시되는 동안 처리기 개체가 언로드되지 않습니다.
- PropSheetPageProc 콜백 함수를 구현하고 pfnCallback 멤버에 포인터를 할당할 수도 있습니다. 이 함수는 페이지를 만들 때와 제거하려고 할 때 호출됩니다.
- PROPSHEETPAGE 구조를 CreatePropertySheetPage 함수에 전달하여 페이지의 HPAGE 핸들을 만듭니다.
- lpfnAddPage가 가리키는 함수를 호출합니다. 첫 번째 매개 변수를 이전 단계에서 만든 HPAGE 핸들로 설정합니다. 두 번째 매개 변수를 셸에서 AddPages에 전달한 lParam 값으로 설정합니다.
- 페이지와 연결된 모든 메시지는 PROPSHEETPAGE 구조의 pfnDlgProc 멤버에 할당된 대화 상자 프로시저로 전달됩니다.
- pfnCallback에 PropSheetPageProc 콜백 함수를 할당한 경우 페이지가 제거될 때 호출됩니다. 그러면 처리기가 보유하고 있는 참조를 해제하는 등 필요한 정리 작업을 수행할 수 있습니다.
다음 코드 샘플에서는 간단한 AddPages 구현을 보여 줍니다 .
STDMETHODIMP CShellPropSheetExt::AddPages(LPFNADDPROPSHEETPAGE, lpfnAddPage, LPARAM lParam)
{
PROPSHEETPAGE psp;
HPROPSHEETPAGE hPage;
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE | PSP_USECALLBACK;
psp.hInstance = g_hInst;
psp.pszTemplate = MAKEINTRESOURCE(IDD_PAGEDLG);
psp.hIcon = 0;
psp.pszTitle = TEXT("Extension Page");
psp.pfnDlgProc = (DLGPROC)PageDlgProc;
psp.pcRefParent = &g_DllRefCount;
psp.pfnCallback = PageCallbackProc;
psp.lParam = (LPARAM)this;
hPage = CreatePropertySheetPage(&psp);
if(hPage)
{
if(lpfnAddPage(hPage, lParam))
{
this->AddRef();
return S_OK;
}
else
{
DestroyPropertySheetPage(hPage);
}
}
else
{
return E_OUTOFMEMORY;
}
return E_FAIL;
}
g_hInst 변수는 DLL에 대한 instance 핸들이며, IDD_PAGEDLG 페이지의 대화 상자 템플릿의 리소스 ID입니다. PageDlgProc 함수는 페이지의 메시지를 처리하는 대화 상자 프로시저입니다. g_DllRefCount 변수는 개체의 참조 횟수를 보유합니다. AddPages 메서드는 AddRef를 호출하여 개수를 증분합니다. 그러나 페이지가 제거될 때 참조 수는 콜백 함수 PageCallbackProc에 의해 해제됩니다.
설명
셸 확장 처리기를 등록하는 방법에 대한 일반적인 설명은 셸 확장 처리기 만들기를 참조하세요.
관련 항목