Вы можете загрузить (например) только 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. Пока битовость совпадает, они будут продолжать загружаться в процессе, как и раньше. Единственное отличие, которое он сделает, состоит в том, что станет возможным создать его вне процесса у клиента другой битности.