我正在处理两个基于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



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

最佳答案

类型库很有可能是针对win64平台的。
检查类型库的属性。一个人可以通过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;

希望这可以帮助您解决问题

09-30 13:05