注册 OLE 控件
与其他 OLE 服务器对象一样,OLE 控件可由其他 OLE 感知应用程序访问。 这是通过注册控件的类型库和类来实现的。
利用下列函数,您可在 Windows 注册数据库中添加和删除控件的类、属性页和类型库:
注册 OLE 控件
名称 | 描述 |
---|---|
AfxOleRegisterControlClass | 将控件的类添加到注册数据库。 |
AfxOleRegisterPropertyPageClass | 将控件属性页添加到注册数据库。 |
AfxOleRegisterTypeLib | 将控件的类型库添加到注册数据库。 |
AfxOleUnregisterClass | 从注册数据库中删除控件类或属性页类。 |
AfxOleUnregisterTypeLib | 从注册数据库中删除控件的类型库。 |
一般在控件 DLL 的 AfxOleRegisterTypeLib
实现中调用 DllRegisterServer
。 同样,AfxOleUnregisterTypeLib
由 DllUnregisterServer
调用。 AfxOleRegisterControlClass
、AfxOleRegisterPropertyPageClass
和 AfxOleUnregisterClass
一般由控件的类工厂或属性页的 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。可以将
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
控件类的唯一 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 版本中,int
nRegFlags 参数不可用。 另请注意,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