如何註冊及實作檔案類型的屬性工作表處理常式
當使用者以滑鼠右鍵按一下檔案類型的成員以顯示 Properties 屬性工作表時,Shell 會呼叫針對檔案類型註冊的屬性工作表處理常式。 每個處理常式都可以將一個自訂頁面新增至預設屬性表。
您所需了解的事情
技術
- 殼層
必要條件
- 瞭解快顯功能表
指示
步驟 1:註冊檔案類型的屬性工作表處理常式
除了一般元件物件模型 (COM) 註冊之外,將 PropertySheetHandlers 子機碼新增至與檔案類型相關聯之應用程式的 ProgID 索引鍵殼 層ex 子機碼。 使用處理程式的名稱建立 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 方法需要非ken 實作。 Shell 不會呼叫 IShellPropSheetExt::ReplacePage。
IShellPropSheetExt::AddPages方法可讓屬性工作表處理常式將頁面新增至屬性工作表。 方法有兩個輸入參數。 第一個 lpfnAddPage是 AddPropSheetPageProc 回呼函式的指標,用來提供 Shell 以將頁面新增至屬性工作表所需的資訊。 第二個 lParam是處理常式未處理的 Shell 定義值。 呼叫回呼函式時,它只會傳回殼層。
實作 AddPages 的一般程式如下所示。
實作 AddPages 方法
- 將適當的值指派給 PROPSHEETPAGE 結構的成員。 尤其是:
- 將保存處理常式參考計數的變數指派給 pcRefParent 成員。 這個做法可防止在屬性工作表仍顯示時卸載處理常式物件。
- 您也可以實作 PropSheetPageProc 回呼函式,並將其指標指派給 pfnCallback 成員。 當頁面建立且即將終結時,就會呼叫此函式。
- 將 PROPSHEETPAGE 結構傳遞至 CreatePropertySheetPage 函式,以建立頁面的 HPAGE 控制碼。
- 呼叫 lpfnAddPage所指向的函式。 將其第一個參數設定為上一個步驟中建立的 HPAGE 控制碼。 將其第二個參數設定為 Shell 傳入AddPages的lParam值。
- 與頁面相關聯的任何訊息都會傳遞至指派給PROPSHEETPAGE結構的pfnDlgProc成員的對話方塊程式。
- 如果您將 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 延伸模組處理常式的一般討論,請參閱 建立殼層延伸模組處理常式。
相關主題