다음을 통해 공유


파일 형식에 대한 속성 시트 처리기를 등록하고 구현하는 방법

사용자가 파일 형식의 멤버를 마우스 오른쪽 단추로 클릭하여 속성 속성 시트를 표시하면 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 메서드 구현

  1. PROPSHEETPAGE 구조체의 멤버에 적절한 값을 할당합니다. 특히 다음 사항에 주의하십시오.
    • 처리기의 참조 수를 보유하는 변수를 pcRefParent 멤버에 할당합니다. 이렇게 하면 속성 시트가 계속 표시되는 동안 처리기 개체가 언로드되지 않습니다.
    • PropSheetPageProc 콜백 함수를 구현하고 pfnCallback 멤버에 포인터를 할당할 수도 있습니다. 이 함수는 페이지를 만들 때와 제거하려고 할 때 호출됩니다.
  2. PROPSHEETPAGE 구조를 CreatePropertySheetPage 함수에 전달하여 페이지의 HPAGE 핸들을 만듭니다.
  3. lpfnAddPage가 가리키는 함수를 호출합니다. 첫 번째 매개 변수를 이전 단계에서 만든 HPAGE 핸들로 설정합니다. 두 번째 매개 변수를 셸에서 AddPages에 전달한 lParam 값으로 설정합니다.
  4. 페이지와 연결된 모든 메시지는 PROPSHEETPAGE 구조의 pfnDlgProc 멤버에 할당된 대화 상자 프로시저로 전달됩니다.
  5. pfnCallbackPropSheetPageProc 콜백 함수를 할당한 경우 페이지가 제거될 때 호출됩니다. 그러면 처리기가 보유하고 있는 참조를 해제하는 등 필요한 정리 작업을 수행할 수 있습니다.

다음 코드 샘플에서는 간단한 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에 의해 해제됩니다.

설명

셸 확장 처리기를 등록하는 방법에 대한 일반적인 설명은 셸 확장 처리기 만들기를 참조하세요.

IShellPropSheetExt