如何从32位Excel进程实例化64位类

时间:2019-04-12 21:41:57

标签: excel vba spss

我已经注册了几个特定于Unicom Dimensions / IBM SPSS Data Collection Desktop 7(x64)软件的DLL,并验证这些类是否显示在HKCR /类以及HKLM下。

enter image description here

Dumpbin.exe指示以下依赖项,,我在这里看不到任何看起来不正常的东西,即,没有针对联通软件的任何特定东西,可能尚未注册等。

图像具有以下依赖性

KERNEL32.dll
USER32.dll
GDI32.dll
COMDLG32.dll
ADVAPI32.dll
ole32.dll
OLEAUT32.dll
ATL100.DLL
SHLWAPI.dll
MSVCP100.dll
MSVCR100.dll

但是,当尝试从VBA实例化(Excel 2016,32b)时,它会失败,并显示 429,ActiveX无法创建对象

Dim exp as Object
Set exp = CreateObject("ExportExcel.Export")

我可以从python(64b 3.7)实例化:

from win32com import client
exp = client.Dispatch("ExportExcel.Export")

这就像拥有32b Excel和64b Dimensions一样简单吗? Could I solve this via 64b Excel installation?

Unicom的documentation表示这是实例化类的正确方法(该示例使用早期绑定,我尝试了两者均无济于事)。

' ---- Export the Tables ----
    Dim MYEXPORT As ExportExcelLib.Export
    Set MYEXPORT = New ExportExcelLib.Export
    Export MYEXPORT, TableXml, PropertyXml

此外,联通提供了自己的基于Visual Basic的“ mrScriptBasic”语言。如您所料,它们还使用CreateObject函数实例化类。在他们的脚本软件中,此功能按预期工作,并返回该类的正确实例。

更新

正如Noodles在评论中提到的那样,我试图通过dllhost强制它。我以管理员身份运行.bat:

REM _Enable.bat
REM This file merges reg_script.reg using the Reg.exe command.
REM This allows 32b program to call a 64b dll via surrogate
REM It is a per user setting but Regedit doesn't allow non admins to run it
reg import "reg_script.reg"
Pause

这将如下所示导入reg_script.reg文件:

Windows Registry Editor Version 5.00
;reg_script.reg
[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
@="ExportExcel"
"AppID"="{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\AppID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"DllSurrogate"=""

[HKEY_CURRENT_USER\SOFTWARE\Classes\AppID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"DllSurrogate"=""

无论我尝试使用类名还是GUID,错误仍然存​​在。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并使用以下网页中描述的解决方案解决了该问题: https://techtalk.gfi.com/32bit-object-64bit-environment/

如果网页不可用,请在此处复制其主要段落:

为此,它涉及少量的简单注册表攻击:

  • 在COM对象的GUID下找到 HKey_Classes_Root \ Wow6432Node \ CLSID [GUID]

  • 找到后,添加一个新的REG_SZ(字符串)值。名称应为AppID 并且数据应该与您刚刚搜索的COM对象GUID相同 为

  • 在HKey_Classes_Root \ Wow6432Node \ AppID \下添加新密钥 应该被称为与com对象GUID相同

  • 在您刚刚添加的新键下,添加一个新的REG_SZ(字符串)值, 并命名为DllSurrogate。将值留空

  • 在HKey_Local_Machine \ Software \ Classes \ AppID \下创建一个新密钥 同样,新密钥的名称应与COM对象的GUID相同。 无需在此键下添加任何值。

就是这样,您的COM对象现在应该可以在64位环境中访问,并且可以像常规COM对象一样使用。

答案 1 :(得分:1)

Windows Registry Editor Version 5.00
;reg_script.reg
[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"AppID"="{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\CLSID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"AppID"="{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\AppID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"DllSurrogate"=""

[HKEY_CURRENT_USER\SOFTWARE\Classes\AppID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"DllSurrogate"=""

如果GUID正确