什么决定RegisterTypeLib是写入win32还是win64?

时间:2012-03-28 19:42:08

标签: windows com atl typelib

我正在使用两个基于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

我应该从哪里开始寻找并解决此问题?

2 个答案:

答案 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资源。