Как мне зарегистрировать 32-битный внепроцессный ATL COM-сервер, чтобы сделать его доступным из 64-битных программ?

У нас есть 32-битный внепроцессный COM-сервер ATL. Чтобы зарегистрироваться в реестре, он вызывает CComModule::UpdateRegistryFromResource() и передает идентификатор файла .rgs, скомпилированного в ресурсы того же исполняемого файла.

Отлично работает на 32-битных системах, но не на 64-битных. Очевидно, что когда 32-битный .exe запускается в 64-битной Windows, его доступ к реестру перенаправляется, и поэтому он регистрируется в «32-битном HKCR», и поэтому 64-битные программы не видят его регистрации.

Как зарегистрировать тот же внепроцессный сервер в 64-битном HKCR самым дешевым и надежным способом?


person sharptooth    schedule 17.11.2010    source источник


Ответы (1)


Насколько я могу судить / помнить, вам на самом деле не нужно делать ничего особенного.

Я проверил 32-битный ATL COM EXE-сервер, который я написал специально для вызова из 64-битного кода (http://www.pretentiousname.com/adobe_pdf_x64_fix/index.html), а регистрационный код полностью шаблонный (если только я не забыл и сегодня не вижу что-то, что мне пришлось изменить).

Если код на 64-битной стороне, вызывающей CoCreateInstance (Ex), специально не передает CLSCTX_ACTIVATE_64_BIT_SERVER, COM при необходимости должен автоматически проверять 32-битный реестр. (Даже если передается CLSCTX_ACTIVATE_64_BIT_SERVER, он все равно может пройти. MSDN не совсем ясно, является ли этот флаг предпочтением или требованием. Я предполагаю, что он все равно не передается.)

Возможно, проблема не в том, как зарегистрирован COM-сервер, а в другом. Или, возможно, есть неработающая 64-битная версия зарегистрированного сервера, возможно, из более ранней в разработке / тестировании, которая выбирается вместо 32-битного сервера и дает сбой?

Между прочим, есть различия в том, какие части реестра разделены на 32/64-битные в Windows 7 и более ранних версиях ОС, но по опыту я знаю, что вам не нужно делать ничего особенного в Vista, Windows 7 и Server. 2008 R2. Я лично не тестировал другие версии ОС (например, XPx64).

person Leo Davidson    schedule 17.11.2010
comment
Вы просто вызываете что-то вроде CComModule :: RegisterServer ()? - person sharptooth; 07.07.2011