註冊 OLE 控制項
OLE 控制項就像其他 OLE 伺服器物件,可以由其他 OLE 感知應用程式存取。 只要註冊控制項的類型程式庫和類別即可。
下列函式可讓您在 Windows 註冊資料庫中加入和移除控制項的類別、屬性頁和類型程式庫:
註冊 OLE 控制項
名稱 | 描述 |
---|---|
AfxOleRegisterControlClass | 將控制項的類別加入至註冊資料庫。 |
AfxOleRegisterPropertyPageClass | 將控制項屬性頁加入至註冊資料庫。 |
AfxOleRegisterTypeLib | 將控制項的類型程式庫加入至註冊資料庫。 |
AfxOleUnregisterClass | 從註冊資料庫移除控制項類別或屬性頁類別。 |
AfxOleUnregisterTypeLib | 從註冊資料庫移除控制項的類型程式庫。 |
通常在控制項 DLL 實作 AfxOleRegisterTypeLib
時呼叫 DllRegisterServer
。 同樣地,AfxOleUnregisterTypeLib
是由 DllUnregisterServer
呼叫。 通常 AfxOleRegisterControlClass
、AfxOleRegisterPropertyPageClass
和 AfxOleUnregisterClass
是由控制項的 Class Factory 或屬性頁的 UpdateRegistry
成員函式呼叫。
AfxOleRegisterControlClass
向 Windows 註冊資料庫註冊控件類別。
BOOL AFXAPI AfxOleRegisterControlClass(
HINSTANCE hInstance,
REFCLSID clsid,
LPCTSTR pszProgID,
UINT idTypeName,
UINT idBitmap,
int nRegFlags,
DWORD dwMiscStatus,
REFGUID tlid,
WORD wVerMajor,
WORD wVerMinor);
參數
hInstance
與控件類別相關聯的模組實例句柄。
clsid
控制項的唯一類別 ID。
pszProgID
控制項的唯一程式 ID。
idTypeName
字串的資源識別元,其中包含控制項的用戶可讀取類型名稱。
idBitmap
用來代表工具列或調色盤中 OLE 控件之點陣圖的資源標識碼。
nRegFlags
包含下列一或多個旗標:
afxRegInsertable
允許控制元件出現在 OLE 物件的 [插入物件] 對話框中。afxRegApartmentThreading
將登錄中的線程模型設定為 ThreadingModel=Apartment。afxRegFreeThreading
將登錄中的線程模型設定為 ThreadingModel=Free。您可以結合這兩個旗標
afxRegApartmentThreading
和afxRegFreeThreading
來設定 ThreadingModel=Both。 如需線程模型註冊的詳細資訊,請參閱 Windows SDK 中的 InprocServer32 。
注意
在 MFC 4.2 之前的 MFC 版本中,int
nRegFlags 參數是 BOOL 參數 bInsertable,允許或不允許從 [插入物件] 對話框插入控件。
dwMiscStatus
包含下列一或多個狀態旗標(如需旗標的描述,請參閱 Windows SDK 中的 OLEMISC 列舉):
OLEMISC_RECOMPOSEONRESIZE
OLEMISC_ONLYICONIC
OLEMISC_INSERTNOTREPLACE
OLEMISC_STATIC
OLEMISC_CANTLINKINSIDE
OLEMISC_CANLINKBYOLE1
OLEMISC_ISLINKOBJECT
OLEMISC_INSIDEOUT
OLEMISC_ACTIVATEWHENVISIBLE
OLEMISC_RENDERINGISDEVICEINDEPENDENT
OLEMISC_INVISIBLEATRUNTIME
OLEMISC_ALWAYSRUN
OLEMISC_ACTSLIKEBUTTON
OLEMISC_ACTSLIKELABEL
OLEMISC_NOUIACTIVATE
OLEMISC_ALIGNABLE
OLEMISC_IMEMODE
OLEMISC_SIMPLEFRAME
OLEMISC_SETCLIENTSITEFIRST
tlid
控件類別的唯一標識符。
wVerMajor
控件類別的主要版本號碼。
wVerMinor
控件類別的次要版本號碼。
傳回值
如果已註冊控件類別,則為非零;否則為 0。
備註
這可讓 OLE 控制件感知的容器使用 控制項。 AfxOleRegisterControlClass
以控件在系統上的名稱和位置更新登錄,同時設定控件在登錄中支持的線程模型。 如需詳細資訊,請參閱 技術附註 64、「OLE 控件中的 Apartment-Model 線程」和 Windows SDK 中的關於進程和線程 。
範例
// Member function implementation of class COleObjectFactory::UpdateRegistry
//
BOOL CMyAxCtrl::CMyAxCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_NVC_MFCAXCTL,
IDB_NVC_MFCAXCTL,
afxRegInsertable | afxRegApartmentThreading,
_dwMyOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
上述範例示範如何使用 AfxOleRegisterControlClass
旗標來呼叫 ,以便插入和Apartment模型 ORed 的旗標一起建立第六個參數:
afxRegInsertable | afxRegApartmentThreading,
控件會顯示在已啟用容器的 [插入物件] 對話框中,而且將會是 Apartment 模型感知。 Apartment 模型感知控件必須確保靜態類別數據受到鎖定保護,如此一來,當一個 Apartment 中的控件存取靜態數據時,排程器在完成之前不會停用它,而相同類別的另一個實例會開始使用相同的靜態數據。 對靜態數據的任何存取都會以重要區段程式代碼括住。
需求
標頭 afxctl.h
AfxOleRegisterPropertyPageClass
向 Windows 註冊資料庫註冊屬性頁類別。
BOOL AFXAPI AfxOleRegisterPropertyPageClass(
HINSTANCE hInstance,
REFCLSID clsid,
UINT idTypeName,
int nRegFlags);
參數
hInstance
與屬性頁類別相關聯的模組實例句柄。
clsid
屬性頁的唯一類別識別碼。
idTypeName
字串的資源識別元,其中包含屬性頁的用戶可讀取名稱。
nRegFlags
可能包含 旗標:
afxRegApartmentThreading
將登錄中的線程模型設定為 ThreadingModel = Apartment。
注意
在 MFC 4.2 之前的 MFC 版本中,int
無法使用 nRegFlags 參數。 另請注意, afxRegInsertable
旗標對屬性頁而言不是有效的選項,而且如果已設定,則會在 MFC 中造成 ASSERT
傳回值
如果已註冊控件類別,則為非零;否則為 0。
備註
這可讓 OLE 控制件感知的容器使用屬性頁。 AfxOleRegisterPropertyPageClass
使用屬性頁名稱及其在系統上的位置來更新登錄,並設定控件在登錄中支持的線程模型。 如需詳細資訊,請參閱 技術附註 64、「OLE 控件中的 Apartment-Model 線程」和 Windows SDK 中的關於進程和線程 。
需求
標頭 afxctl.h
AfxOleRegisterTypeLib
向 Windows 註冊資料庫註冊類型程式庫,並且允許其他 OLE 控制項感知的容器使用類型程式庫。
BOOL AfxOleRegisterTypeLib(
HINSTANCE hInstance,
REFGUID tlid,
LPCTSTR pszFileName = NULL,
LPCTSTR pszHelpDir = NULL);
參數
hInstance
類型程式庫相關的應用程式的執行個體控制代碼。
tlid
類型程式庫的唯一 ID。
pszFileName
指向控制項的當地語系化類型程式庫 (.TLB) 檔案的選擇性檔名的指標。
pszHelpDir
可以找到此類型程式庫的說明檔的目錄名稱。 如果為 NULL,則會假設說明檔位於與類型連結庫本身相同的目錄中。
傳回值
如果類型程式庫已註冊則為非零,否則為 0。
備註
此函式會以類型程式庫名稱及其在系統上的位置更新登錄。
範例
// Type library guid definition.
const GUID CDECL BASED_CODE _tlid =
{ 0x77E58ED8, 0xA2C0, 0x4C13, { 0xB6, 0xC1, 0xBA, 0xD1, 0x19, 0xAF, 0xE3, 0xF1 } };
// Registers type library and the interfaces
// in it, afxctl.h needs to be included
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
// CMFCAutomation.tlb should be in the same directory as exe module.
// last param can be null if help file associated w/ tlb is in same dir as .tlb
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid,
_T("CMFCAutomation.tlb"), NULL))
{
return ResultFromScode(SELFREG_E_TYPELIB);
}
需求
標頭 afxdisp.h
AfxOleUnregisterClass
從 Windows 註冊資料庫移除控制項或屬性頁類別專案。
BOOL AFXAPI AfxOleUnregisterClass(REFCLSID clsID, LPCSTR pszProgID);
參數
clsID
控件或屬性頁的唯一類別標識碼。
pszProgID
控件或屬性頁的唯一程式標識碼。
傳回值
如果控件或屬性頁類別已成功取消註冊,則為非零;否則為 0。
需求
標頭 afxctl.h
AfxOleUnregisterTypeLib
呼叫此函式,以從 Windows 註冊資料庫移除類型連結庫專案。
BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlID);
參數
tlID
類型程式庫的唯一 ID。
傳回值
如果類型庫已成功取消註冊,則為非零;否則為 0。
範例
// Type library GUID, corresponds to the uuid attribute of the library
// section in the .odl file.
const GUID CDECL BASED_CODE _tlid =
{0xA44774E8, 0xAE00, 0x451F, {0x96, 0x1D, 0xC7, 0xD2, 0xD2, 0x58, 0xA0, 0x75}};
// Type library major version number, number on the left of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMajor = 1;
// Type library minor version number, number on the right of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMinor = 0;
STDAPI DllUnregisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
需求
標頭 afxdisp.h