[英]How to Instantiate a 64-bit Class from 32-bit Excel Process
我已經注冊了幾個特定於 Unicom Dimensions / IBM SPSS Data Collection Desktop 7 (x64) 軟件的 DLL,並驗證這些類是否顯示在 HKCR/Classes 和 HKLM 下。
Dumpbin.exe 指示以下依賴關系,我在這里沒有看到任何看起來不合時宜的東西,即,沒有任何特定於可能未注冊的 Unicom 軟件等。
圖像具有以下依賴項
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 一樣簡單嗎? 我可以通過 64b Excel 安裝解決這個問題嗎?
Unicom 的文檔表明這是實例化該類的正確方法(該示例使用了早期綁定,我都試過了都無濟於事)。
' ---- 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,錯誤仍然存在。
我遇到了同樣的問題,使用以下網頁中描述的解決方案解決了這個問題: https ://techtalk.gfi.com/32bit-object-64bit-environment/
如果網頁不可用,我將其主要段落復制到此處:
為此,它涉及少量簡單的注冊表黑客:
在 HKey_Classes_Root\Wow6432Node\CLSID[GUID] 下找到您的 COM 對象 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 對象一樣使用。
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 正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.