共用方式為


如何註冊及實作檔類型的屬性表處理程式

當使用者以滑鼠右鍵按下檔類型的成員以顯示 Properties 屬性表時,Shell 會呼叫為檔類型註冊的屬性表處理程式。 每個處理程式都可以將一個自定義頁面新增至預設屬性表。

您需要知道的事項

技術

先決條件

  • 瞭解捷徑選單

指示

步驟 1:註冊檔類型的屬性表處理程式

除了一般元件物件模型 (COM) 註冊之外,請將 PropertySheetHandlers 子機碼新增至與文件類型相關聯之應用程式 ProgID 索引鍵的 shellex 子機碼。 使用處理程式的名稱建立 PropertySheetHandlers 子機碼,並將預設值設定為屬性表處理程式類別標識碼 (CLSID) GUID 的字串形式。

若要將多個頁面新增至屬性表,請註冊每個頁面的處理程式。 屬性表可支持的頁數上限為 32。 若要註冊多個處理程式,請在每個處理程式的 shellex 索引鍵下建立索引鍵,並將預設值設定為處理程式的 CLSID GUID。 不需要為每個處理程式建立不同的物件,這表示多個處理程式都可以有相同的 GUID 值。 頁面會按照shellex下所列的索引鍵順序顯示。

下列範例說明一個登錄專案,可針對範例 .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 方法需要非標記實作。 Shell 不會呼叫 IShellPropSheetExt::ReplacePage

IShellPropSheetExt::AddPages 方法可讓屬性表處理程式將頁面新增至屬性表。 方法有兩個輸入參數。 第一個,lpfnAddPage,是指向用來提供殼層將頁面新增至屬性表所需資訊的 AddPropSheetPageProc 回呼函式的指標。 第二個 lParam是一個 Shell 定義的值,無需處理程式處理。 當呼叫回呼函式時,該對象將簡單地傳回給 Shell。

實作 AddPages 的一般程式如下。

實作 AddPages 方法

  1. 將適當的值指派給 PROPSHEETPAGE 結構的成員。 特別是:
    • 將保存處理程式參考計數的變數指派給 pcRefParent 成員。 這種做法可防止在屬性表仍在顯示時卸除處理程序物件。
    • 您也可以實作 PropSheetPageProc 回呼函式,並將其指標指派給 pfnCallback 成員。 建立頁面時以及即將終結時,就會呼叫此函式。
  2. PROPSHEETPAGE 結構傳遞至 CreatePropertySheetPage 函式,以建立頁面的 HPAGE 句柄。
  3. 呼叫由 lpfnAddPage所指向的函式。 將其第一個參數設定為上一個步驟中建立的HPAGE句柄。 將其第二個參數設定為 Shell lParam 傳遞到 AddPages 的值。
  4. 與頁面相關聯的任何訊息都將傳遞到被指派給 PROPSHEETPAGE 結構中的 pfnDlgProc 成員之對話框程序。
  5. 如果您將 PropSheetPageProc 回呼函式指派給 pfnCallback,則會在頁面即將銷毀時被呼叫。 接著,您的處理程式可以執行任何必要的清除作業,例如釋放其所持有的任一參考。

下列程式代碼範例說明簡單 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 的實例句柄,IDD_PAGEDLG是頁面對話框範本的資源識別碼。 PageDlgProc 函式是處理頁面訊息的對話框程式。 g_DllRefCount 變數會保存對象的參考計數。 AddPages 方法會呼叫 AddRef 來遞增計數。 不過,當頁面即將被銷毀時,回調函式 PageCallbackProc會釋放參考計數。

備註

如需了解如何註冊 Shell 擴充模組處理程式的一般討論,請參閱 建立 Shell 擴充模組處理程式

IShellPropSheetExt