共用方式為


註冊 OLE 控制項

OLE 控制項就像其他 OLE 伺服器物件,可以由其他 OLE 感知應用程式存取。 只要註冊控制項的類型程式庫和類別即可。

下列函式可讓您在 Windows 註冊資料庫中加入和移除控制項的類別、屬性頁和類型程式庫:

註冊 OLE 控制項

名稱 描述
AfxOleRegisterControlClass 將控制項的類別加入至註冊資料庫。
AfxOleRegisterPropertyPageClass 將控制項屬性頁加入至註冊資料庫。
AfxOleRegisterTypeLib 將控制項的類型程式庫加入至註冊資料庫。
AfxOleUnregisterClass 從註冊資料庫移除控制項類別或屬性頁類別。
AfxOleUnregisterTypeLib 從註冊資料庫移除控制項的類型程式庫。

通常在控制項 DLL 實作 AfxOleRegisterTypeLib 時呼叫 DllRegisterServer。 同樣地,AfxOleUnregisterTypeLib 是由 DllUnregisterServer 呼叫。 通常 AfxOleRegisterControlClassAfxOleRegisterPropertyPageClassAfxOleUnregisterClass 是由控制項的 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。

    您可以結合這兩個旗標 afxRegApartmentThreadingafxRegFreeThreading 來設定 ThreadingModel=Both。 如需線程模型註冊的詳細資訊,請參閱 Windows SDK 中的 InprocServer32

注意

在 MFC 4.2 之前的 MFC 版本中,intnRegFlags 參數是 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

另請參閱

宏和全域