Что решает, будет ли RegisterTypeLib записывать в win32 или win64? - PullRequest
1 голос
/ 28 марта 2012

Я работаю с двумя проектами COM на базе ATL.

Оба реализуют 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

при регистрации с использованием regsvr32.exe в Windows 7 32-разрядная версия.

Другой проект правильно создает

HKEY_CLASSES_ROOT\TypeLib\<guid>\<version>\0\win32

.

С чего мне начать искать, чтобы найти и исправить это поведение?

Ответы [ 2 ]

4 голосов
/ 29 марта 2012

Вполне возможно, что библиотека типов предназначена для платформы 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 голос
/ 29 марта 2012

Вы создаете либо Win32 DLL, либо x64 DLL, и библиотека типов является вложенным ресурсом.Как вы обнаружили, проекты ATL используют RegisterTypeLib API для регистрации библиотеки типов, и API регистрируется под битрейтом ресурса библиотеки (то есть обычно это оригинальная целевая платформа).

Полагаю, вы получили HKEY_CLASSES_ROOT\TypeLib\<guid>\<version>\0\win64 регистрацию путем создания / регистрации конфигурации x64.

Другая возможная причина заключается в том, что в разделе «Настройка проекта» в Visual Studio в разделе «Общие сведения» Target Environmentустановлен неправильно - это может привести к регистрации Win32 ресурса DLL в подразделе win64.

...