COM代理第三方组件

Sim*_*ter 10 com 64-bit ole

我正在编写一个小型DLL组件,需要访问两个第三方组件来组合数据,其中一个仅为32位,另一个仅为64位.两者都使用TypeLib注册并且与Automation兼容,因此编组不应成为问题.

如果我正确理解了文档,那么除非组件也有AppID和DllSurrogate键,否则无法强制加载代理.由于两者都是第三方组件,我有点不愿意修改他们的注册.

有没有办法在理论上没有任何额外依赖关系的DLL组件的代理进程中激活组件中没有AppID的对象,或者任何人都可以向我解释为什么这会是一个坏主意?

Ben*_*Ben 7

是的,您可以在代理中加载(例如)仅32位的DLL,并以下列方式从64位进程访问它.如果有可用的编组器,这将有效,通常用于具有类型库的组件,因为它们通常使用标准编组器.如果对象需要自定义代理/存根,因为64位版本将不存在,或者您首先不会遇到此问题,它将无法工作.

首先,您需要一个AppID.如果DLL已经有AppID,您应该使用它.您可以通过CLSID键检查您感兴趣的CoClass.

这里使用的示例是Capicom.HashedDataCapicom.EncryptedData类.Capicom只有32位.

您应该使用32位版本的Regedit来执行此操作,因为它是一个32位组件.如果您要从32位访问64位组件,请使用另一个.(这是因为32位兼容层的注册表虚拟化 - 使用匹配的bitness版本的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}"
Run Code Online (Sandbox Code Playgroud)

保存到myComponent-dllhost.reg文件,然后离开.

c:\windows\sysWow64\regedit.exe "myComponent-dllhost.reg"
Run Code Online (Sandbox Code Playgroud)

您现在应该能够从64位脚本/ COM主机访问Capicom.HashedData和Capicom.EncryptedData.

笔记:

  • 这仅适用于基本的OLE自动化类型.任何与VBScript或JavaScript中的Windows Scripting Host脚本兼容的对象都应该没问题.
  • 您只需将AppID添加到可直接创建的对象.这基本上是那些带有InprocServer32条目的.从工厂生成的对象或仅作为子对象可用的对象不必添加AppID.
  • 如果已经存在AppID,则需要添加空字符串"DllSurrogate"条目.而已!
  • 不会影响DLL的普通客户端.只要bit-ness匹配,它们将继续像以前一样在进程中加载​​.它唯一的区别是它可以从不同位的客户端进行实例化.

  • 别害羞!OTOH,如果你真的想要,你可以创建一个相同位的辅助com对象,它只有一个方法`HRESULT CreateObject([in] BSTR progID,[out,retval] IUnknown**ppRetVal)`.有没有在代理中创建对象并将其返回给您. (2认同)