2017-03-31 56 views
1

32位COM DLL我有以下配置:連接64位的Java使用Com4j或雅各

1)的Windows 10 64位

2)一個只有32位版本和可用的應用程序通過COM。

我使用tlbimb.jar訪問32位應用程序的.dll文件以生成所需的接口,並且我成功了。

場景1: 我嘗試使用Java 8 32位安裝來訪問32位應用程序。我可以通過COM 成功調用方法,沒有任何問題。

場景2: 我嘗試使用Java 8 64位安裝來訪問32位應用程序。我得到一個錯誤信息:

Exception in thread "main" com4j.ExecutionException: com4j.ComException: 80040154 CoCreateInstance failed : Class not registered : .\com4j.cpp:153 

我搜索#2 /谷歌的exceptin,我也做了以下內容:

1)同時使用Sys64WOW/regsvr32.exe的和System32註冊的應用程序的DLL /的regsvr32.exe

2)註冊同時使用Sys64WOW/REGSVR32.EXE和System32/REGSVR32.EXE

3)複製在Sys64WOW和System32下文件夾的DLL的com4j DLL(32位和64位)。

我已經完成了上述所有單獨檢查所有可能的組合。使用64位Java的上述錯誤仍然存​​在。

我嘗試過使用另一座橋(雅各布)。在32位Java上它成功了,在64位Java上它失敗了。

我有一個問題,有人可能知道:有沒有什麼辦法可以連接一個應用程序,據我所知,只提供一個Win32 COM dll [1],使用任何可用的Java/COM網橋和Java 64bit?或者只是32位COM + 64位Java不可連接?

[1]:我查了OLE/COM查看器和類型庫有下只有一個條目「0的Win32 =,所以我暗示,這意味着沒有Win64的COM DLL,右

回答

2

這贏了?因爲你的客戶進程和COM DLL的位不匹配當試圖創建一個新的實例時,CoCreateInstance試圖在註冊表的64位配置單元中查找相關的類信息,因爲它實際上位於32位配置單元,您註冊該DLL的位置

要解決這個問題,您可以選擇使用代理進程,該進程允許您的CoClass在不同的本機進程中實例化。通過IPC與代理商溝通(更多信息,請參閱here)。

作爲一個快速入門,您可以將CoClass標記爲默認dllhost.exe替代過程的候選者:OLE/COM對象查看器(x86),如Admin> All Objects> [Your CoClass]> Implementation> Use Surrogate Process路徑爲空)。

如果您打算分發您的應用程序,您可以將此信息放在REG腳本中或將您的DLL導入到COM +服務器應用程序中。

+0

感謝您的回覆。我做了這些「作爲一個快速入門,您可以將您的CoClass標記爲缺省dllhost.exe代理過程的候選對象:OLE/COM對象查看器(x86)>所有對象> [您的CoClass]>實施>使用代理過程路徑爲空)「。但仍然是同樣的錯誤。我勾選使用代理過程框,但是當我導航到另一個CoClass,然後返回到我的CoClass時,該框未被選中。有沒有可能我的選擇沒有保存? – Thanos

+0

你是否以管理員身份運行oleview?它需要各自的權限才能寫入註冊表。您可以通過切換到CoClass的「註冊表」選項卡來驗證設置是否已正確保存。在AppID節點下應該有一個[DllSurrogate]條目。 – Aurora

+0

好吧,我必須以管理員身份運行。現在它被保存下來並且可以在64位Java上運行。非常感謝你。你的幫助真的很感激。 – Thanos