簡體   English   中英

如何從 32 位 Excel 進程實例化 64 位類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM