64-битный C # с 32-битным COM-объектом VB6 - PullRequest
3 голосов
/ 04 марта 2009

У меня есть 32-битный in-proc STA VB6 dll. Я, к сожалению, ничего не могу с этим поделать. Мой компонент C # очень выигрывает, будучи 64-битным. Есть ли в любом случае для вызова / интерфейса с этой 32-битной DLL из моего 64-битного процесса? Любой вид обертки или что-нибудь?

Ответы [ 4 ]

11 голосов
/ 04 марта 2009

Нет прямого пути, которым вы можете сделать это.

Поскольку вы не можете портировать VB6 inproc dll, я бы посоветовал вам написать 32-битный сервер вне процесса, который реализует те же интерфейсы и делегировать его в код VB6. Затем ваше 64-битное приложение может вызывать внепроцессный сервер, поскольку COM позаботится о распределении типов между процессами.

Это не красиво, но это будет работать!

7 голосов
/ 04 марта 2009

Эта статья Работа с устаревшими 32-битными компонентами в 64-битной Windows поможет вам:

Я нашел это решение, см. В статье :
• Преобразование типа проекта из незавершенного в процесс
• Использование COM + в качестве хоста (это работа для меня)
• Использование dllhost в качестве суррогатного хоста

5 голосов
/ 18 января 2012

Вы можете загрузить (например) только 32-битную DLL в суррогат и получить к ней доступ из 64-битного процесса, следующим образом.

Это будет работать при условии, что есть доступный маршаллер, который обычно будет для компонента с библиотекой типов, потому что они обычно используют стандартный маршаллер. Он не будет работать, если объект запрашивает пользовательский прокси / заглушку, потому что 64-битные версии не существуют, или у вас не возникло бы этой проблемы в первую очередь.

Как зарегистрировать сторонний 32-битный компонент для использования с 64-битного клиента

Сначала вам нужен AppID. Если у DLL уже есть AppID, вы должны использовать это. Узнать это можно, проверив под ключом CLSID интересующий вас CoClass.

Пример, используемый здесь, это классы Capicom.HashedData и Capicom.EncryptedData. Capicom только 32-битный.

  • AppID: CAPICOM не имеет AppID, поэтому для AppID я только что использовал CLSID класса EncryptedData.

  • CLSID: Вам необходим список CLSID каждого класса, который вы хотите создать из 64-битных клиентов. В этом примере это просто EncryptedData и HashedData.

  • Регистрация: Создайте файл реестра, содержащий подробную информацию, как показано в примере, и загрузите его в реестр.

Для этого вы должны использовать 32-битную версию Regedit, так как это 32-битный компонент. Если у вас есть 64-битный компонент, доступ к которому вы хотите получить из 32-битного, используйте другой. (Это происходит из-за виртуализации реестра для 32-битного уровня совместимости - использование соответствующей разрядной версии regedit позаботится об этой проблеме, убедившись, что вы отредактировали правильную виртуализированную версию реестра).

Windows Registry Editor Version 5.00


;;; Capicom AppID - just using the Capicom.EncryptedData CLSID
;;; Use default surrogate = empty string
[HKEY_CLASSES_ROOT\AppID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}]
"DllSurrogate"=""

;;; Capicom.EncryptedData
[HKEY_CLASSES_ROOT\CLSID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}]
AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}"

;;; Capicom.HashedData - use same AppID for all!!!!!
[HKEY_CLASSES_ROOT\CLSID\{CE32ABF6-475D-41F6-BF82-D27F03E3D38B}]
AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}"

Сохраните в myComponent-dllhost.reg файл, и все готово.

c:\windows\sysWow64\regedit.exe "myComponent-dllhost.reg"

Теперь вы должны иметь доступ к Capicom.HashedData и Capicom.EncryptedData с 64-битных хостов сценариев / COM.

Примечания:

  • Это работает только для базовых типов автоматизации OLE. Любой объект, совместимый со сценариями Windows Scripting Host в VBScript или JavaScript, должен быть в порядке.
  • Вам нужно только добавить AppID для непосредственно создаваемых объектов. Это в основном те, у которых есть запись InprocServer32. Объекты, которые создаются на фабриках или доступны только как дочерние объекты, необязательно добавлять AppID.
  • Если уже существует AppID, все, что вам нужно сделать, это добавить пустую строку "DllSurrogate" запись. Вот и все!
  • это НЕ повлияет на обычных клиентов DLL. Пока битовость совпадает, они будут продолжать загружаться в процессе, как и раньше. Единственное отличие, которое он сделает, состоит в том, что станет возможным создать его вне процесса у клиента другой битности.
3 голосов
/ 04 марта 2009

32-битный COM-компонент должен завершиться.

Прежде чем приступать к созданию оболочки, проверьте, будет ли COM + (Object Services) ее размещать.

...