В чем разница между вызовом CComModule.RegisterServer, _AtlComModule.RegisterServer и LoadTypeLibEx для регистрации TypeLib?

В моем методе DllRegisterServer моей COM-dll у меня ранее был код, который называл LoadTypeLibEx (module, REGKIND_REGISTER, & pTypeLib) для регистрации моих COM-классов и соответствующих им TypeLib. Моя COM-DLL - 64-разрядная. Я заметил, что в моей 64-битной системе Vista в разделе HKCR: \\ TypeLib \ {myguid} \ 1.0 \ 0 я нахожу подраздел win32 с местоположением моей COM DLL.

У меня также есть другой код в отдельной COM-DLL, которую я поддерживаю, которая использует старый, теперь устаревший вызов CComModule.RegisterServer (TRUE). Этот код создает подраздел win64 под ключом 0 для 64-битной DLL и подраздел win32 под ключом 0 для 32-битной DLL. Я использую правильную разрядную версию regsvr32 для выполнения регистрации во всех случаях (соответствие разрядности regsvr32 разрядности DLL).

Почему LoadTypeLibEx и _AtlComModule.RegisterServer не создают ключ win64 для 64-разрядной библиотеки DLL, содержащей мою TypeLib, в то время как более старый CComModule.RegisterServer создает правильные ключи?


person Zach    schedule 30.03.2009    source источник
comment
win64 не правильный. Это в вашем .rgs файле?   -  person Hans Passant    schedule 31.03.2009
comment
Его нет в моем файле rgs. Windows делает это с помощью некоторых собственных библиотек типов (по крайней мере, то, что я вижу в Vista x64). Например, посмотрите HKEY_CLASSES_ROOT \ TypeLib \ {DCB00D01-570F-4A9B-8D69-199FDBA5723B} \ 1.0 \ 0, под ним должен быть подраздел win64.   -  person Zach    schedule 31.03.2009
comment
Или для того, у которого есть разделы win32 и win64: HKEY_CLASSES_ROOT \ Wow6432Node \ TypeLib \ {11DD5EA9-F8DB-4F6E-BF7C-6AADBA404A3D} \ 1.0 \ 0. Хотелось бы знать, зачем это делается.   -  person Zach    schedule 31.03.2009
comment
Кроме того, если вы читаете здесь: blogs.msdn.com/larryosterman /archive/2006/01/09/510856.aspx вы увидите, что Ларри упоминает, включая win32 или win64, в зависимости от платформы. Я хочу знать, при каких обстоятельствах это должно произойти, используя вышеуказанный Windows API. Спасибо!   -  person Zach    schedule 31.03.2009


Ответы (1)


Похоже, что поведение, которое я наблюдаю в отношении подключей win32 / win64, отражает тот факт, что некоторые библиотеки типов можно использовать в 64-битных и 32-битных программах, поскольку они не содержат параметров с ограничением по битам (чтение: указатель). Между тем, для других библиотек типов требуются разные записи для win32 и win64, потому что они несовместимы.

Таким образом, может показаться, что наблюдаемое мной поведение на самом деле не из-за используемых мной методов регистрации, а из-за базовых библиотек типов.

person Zach    schedule 03.04.2009