Как использовать 32-битный COM-объект в Windows Server 2008 (работает на 2008 R2, но не на 2008) - PullRequest
4 голосов
/ 28 октября 2010

Я использую DllSurrogate по умолчанию для включения автоматизации 32-битного COM-объекта в 64-битной. Это прекрасно работает в 64-битной Windows7 и Windows Server 2008 R2. Тем не мение; Обычный вариант Windows Server 2008 (до R2) полностью игнорирует запись DllSurrogate в реестре. Я исследовал это в течение нескольких дней и нашел документацию, что классический Windows Server 2008 имел отражение в реестре, которое игнорирует значение DllSurrogate, если оно пустое. (Я оставляю значение строки реестра пустым, чтобы использовать суррогат по умолчанию.) Чтобы обойти это неотраженное (не копируется между 32-битными и 64-битными регистрами), я запускаю regedit.exe * 32 и устанавливаю ключи. Затем я открываю обычный regedit и устанавливаю ключи. Все еще не повезло. Я также попытался установить для параметра реестра DllSurrogate значение c: \ windows \ syswow64 \ dllhost.exe, чтобы это значение не было пустым, но это не работало вообще (в любой ОС). Я получаю сообщение об ошибке «не могу создать объект activex».

Я воспроизвел проблему на 2 разных компьютерах с Windows Server 2008 (до R2). Я также убедился, что объект COM можно использовать на этих машинах при запуске из 32-разрядного приложения. Для тестирования я использовал 32-битный и 64-битный LINQPad. LINQPad, работающий как 32-битный, может создать объект COM. 64-разрядная LINQPad не может.

[текст ссылки] [1] http://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx <- Документация о том, что запись реестра DllSurrogate не отражена в Windows Server 2008, но я не знаю, как обойти это ограничение. Я пытался использовать regedit.exe * 32 для непосредственного редактирования 32-битного реестра. </p>

Есть идеи, что мне здесь не хватает? Есть ли какая-то особая хитрость для использования DllSurrogate по умолчанию (dllhost.exe) на pre-R2? Переписать наш COM в .NET сейчас не вариант. Я надеюсь, что мне чего-то не хватает, так как это работает на последней версии Windows Server 2008 R2.

Спасибо, что заглянули! Дэнни

1 Ответ

12 голосов
/ 29 октября 2010

Проблема решена!Спасибо, Ганс, за то, что поставил меня на правильный путь!Я случайно настроил систему на использование 64-битного файла DLLHost.exe, который не работал, поскольку он не мог запустить 32-битный COM-объект.

От начала до конца, вот как ясмог использовать мой 32-битный COM-объект из 64-битного приложения.

  1. Зарегистрировать COM-объект с помощью regedit * 32 (c: \ windows \ syswow64 \ regedit)

  2. Внести следующие изменения в реестр.Обязательно поместите все это под Wow6432Node, чтобы использовался 32-битный DLLHost.

  3. Определите GUID вашего COM-объекта, выполнив поиск в реестре для имени класса.то есть.Имя класса будет значением, которое вы передаете для создания объекта, например CreateObject ("имя класса").

  4. Найдите существующий ключ HKey_Classes_Root\Wow6432Node\CLSID\[GUID].Добавьте новое значение REG_SZ (строка) под названием AppID с GUID COM-объекта в качестве значения.

  5. Добавьте новый ключ HKey_Classes_Root\Wow6432Node\AppID\[GUID].Под этим новым ключом добавьте новое значение REG_SZ (string) с именем DllSurrogate.Оставьте значение пустым.

  6. Если его там еще нет, создайте новый ключ в HKey_Local_Machine\Software\Wow6432Node\Classes\AppID\[GUID].Если его там еще нет, добавьте новое значение REG_SZ (string) с именем DllSurrogate под этим ключом.Оставьте значение пустым.

Теперь, когда вы создаете свой COM-объект, вы должны увидеть DLLHost.exe * 32 в диспетчере задач.Включите столбец командной строки в диспетчере задач, и вы должны увидеть C:\windows\syswow64\dllhost.exe /processid:{YourCOMGUIDHere}

...