您可以设置注册表项以允许 x64 加载 x32 库。
所以 COM 会忽略 EXE 文件中的位数。因此,任何 COM 客户端都可以加载任何 EXE 文件(反之亦然,尽管没人关心)。通过设置注册表项,您可以强制您的 DLL 进入 DLLHOST.exe。
COM 将 64 位存根加载到 Excel 中并与存根通信。据 Excel 所知,它已经加载了 64 位 dll。
一个问题是您无权更改一个注册表项。您必须取得所有权并授予自己添加条目的权限。与文件不同,没有内置工具可以自动执行此操作。
以下 reg 文件启用 MSScript 控件,它允许您将 VBScript 和 JScript 作为宏语言执行。微软想要杀死 VBScript 和 JScript 以及 MS Script Control。因此,为了兼容性,它只能作为 32 位 dll 使用。将宏语言添加到任何程序都需要不到一分钟的时间。与您必须付费使用的 VBA 形成对比。请注意需要 TakeOwnership 的一行。
Windows Registry Editor Version 5.00
;MSScript.reg
[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
@="ScriptControl Object"
"AppID"="{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}"
[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\CLSID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
@="ScriptControl Object"
"AppID"="{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}"
;This one needs to be done manually
[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\AppID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"DllSurrogate"=""
[HKEY_CURRENT_USER\SOFTWARE\Classes\AppID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"DllSurrogate"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
@="ScriptControl Object"
"AppID"="{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
@="ScriptControl Object"
"AppID"="{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\AppID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"DllSurrogate"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}]
"DllSurrogate"=""
参考在这里,但只有 DLLSurrogate 是您感兴趣的 - https://docs.microsoft.com/en-us/windows/win32/com/appid-key。
更多的背景参考 - https://docs.microsoft.com/en-us/windows/win32/winprog64/process-interoperability。