注册 OLE 控件

与其他 OLE 服务器对象一样,OLE 控件可由其他 OLE 感知应用程序访问。 这是通过注册控件的类型库和类来实现的。

利用下列函数,您可在 Windows 注册数据库中添加和删除控件的类、属性页和类型库:

注册 OLE 控件

名称 描述
AfxOleRegisterControlClass 将控件的类添加到注册数据库。
AfxOleRegisterPropertyPageClass 将控件属性页添加到注册数据库。
AfxOleRegisterTypeLib 将控件的类型库添加到注册数据库。
AfxOleUnregisterClass 从注册数据库中删除控件类或属性页类。
AfxOleUnregisterTypeLib 从注册数据库中删除控件的类型库。

一般在控件 DLL 的 AfxOleRegisterTypeLib 实现中调用 DllRegisterServer。 同样,AfxOleUnregisterTypeLibDllUnregisterServer 调用。 AfxOleRegisterControlClassAfxOleRegisterPropertyPageClassAfxOleUnregisterClass 一般由控件的类工厂或属性页的 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
包含控件的用户可读类型名称的字符串的资源 ID。

idBitmap
用于在工具栏或调色板中表示 OLE 控件的位图的资源 ID。

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
控件类的唯一 ID。

wVerMajor
控件类的主版本号。

wVerMinor
控件类的次要版本号。

返回值

如果已注册控件类,则为非零;否则为 0。

备注

这允许 OLE 控件感知容器使用控件。 AfxOleRegisterControlClass 会使用控件在系统上的名称和位置更新注册表,并在注册表中设置控件支持的线程模型。 有关详细信息,请参阅技术说明 64“OLE 控件中的单元模型线程处理”和 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);
}

上面的示例演示如何将可插入标志和单元模型 ORed 标志一起使用来调用 AfxOleRegisterControlClass,以创建第六个参数:

afxRegInsertable | afxRegApartmentThreading,

控件会显示在已启用容器的“插入对象”对话框中,并且是单元模型感知控件。 单元模型感知控件必须确保静态类数据受锁定保护,以便在一个单元中的控件访问静态数据期间,在完成并且相同类的另一个实例开始使用相同静态数据之前不会被计划程序所禁用。 对静态数据的任何访问都包含在关键部分代码中。

要求

标头:afxctl.h

AfxOleRegisterPropertyPageClass

向 Windows 注册数据库注册属性页类。

BOOL AFXAPI AfxOleRegisterPropertyPageClass(
   HINSTANCE hInstance,
   REFCLSID  clsid,
   UINT idTypeName,
   int nRegFlags);

参数

hInstance
与属性页类关联的模块的实例句柄。

clsid
属性页的唯一类 ID。

idTypeName
包含属性页的用户可读名称的字符串的资源 ID。

nRegFlags
可能包含标志:

  • afxRegApartmentThreading 将注册表中的线程模型设置为 ThreadingModel = Apartment。

注意

在 MFC 4.2 之前的 MFC 版本中,intnRegFlags 参数不可用。 另请注意,afxRegInsertable 标志不是属性页的有效选项,如果设置了该标志,则会在 MFC 中导致 ASSERT

返回值

如果已注册控件类,则为非零;否则为 0。

备注

这允许 OLE 控件感知容器使用属性页。 AfxOleRegisterPropertyPageClass 会使用属性页在系统上的名称和位置更新注册表,并在注册表中设置控件支持的线程模型。 有关详细信息,请参阅技术说明 64“OLE 控件中的单元模型线程处理”和 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
控件或属性页的唯一类 ID。

pszProgID
控件或属性页的唯一程序 ID。

返回值

如果控件或属性页类已成功注销,则为非零;否则为 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

另请参阅

宏和全局函数