我正在使用两个基于ATL的COM项目。
这两个工具DllRegisterServer
只是
STDAPI DllRegisterServer(void)
{
// registers object, typelib and all interfaces in typelib
return _Module.RegisterServer(TRUE);
}
最终调用
::RegisterTypeLib(pTypeLib, bstrPath, szDir);
atlbase.h中的:6516。
但由于某种原因,这个调用使其中一个项目创建
HKEY_CLASSES_ROOT\TypeLib\<guid>\<version>\0\win64
在Windows 7 32位上使用regsvr32.exe注册时。
另一个项目正确创建
HKEY_CLASSES_ROOT\TypeLib\<guid>\<version>\0\win32
我应该从哪里开始寻找并解决此问题?
答案 0 :(得分:4)
很有可能,类型库是针对win64平台的。 检查typelibary的属性。可以通过ITypeLib::GetLibAttr访问它们:
ITypeLib::GetLibAttr(TLIBATTR **ppTLibAttr)
TLIBATTR结构有一个SYSKIND类型的字段。它包含一个表示平台的值。
typedef enum tagSYSKIND {
SYS_WIN16 = 0,
SYS_WIN32 = ( SYS_WIN16 + 1 ),
SYS_MAC = ( SYS_WIN32 + 1 ),
SYS_WIN64 = ( SYS_MAC + 1 )
} SYSKIND;
我希望这可以帮助您解决问题
答案 1 :(得分:1)
您正在构建Win32
DLL或x64
DLL,类型库是附加资源。正如您发现ATL项目使用RegisterTypeLib
API来注册类型库,并且API将在库资源的位数下注册(即,通常它是原始目标平台)。
我认为您通过构建/注册HKEY_CLASSES_ROOT\TypeLib\<guid>\<version>\0\win64
配置获得x64
注册。
另一个可能的原因是在Visual Studio中的项目设置下,在MIDL下,常规Target Environment
设置不正确 - 这最终可能会在Win32
子项下注册win64
DLL资源。