2011-12-28 42 views
3

我試圖通過64位Java庫調用CoCreateInstance(...):org.eclipse.swt.internal .ole.win32.COM。我試圖掛鉤的DLL是Visual SourceSafe的DLL。該項目的重點是將用於32位Eclipse的VSS插件(http://sourceforge.net/projects/vssplugin/)移植到64位Eclipse中。從64位Java應用程序(未找到註冊表項)訪問32位COM DLL

當我使用org.eclipse.swt.internal.ole.win32.COM的64位版本時,調用工作正常,但是對於32位版本,調用失敗。該呼叫正在使用這樣的:

private void init(GUID guid) { 
    long[] ppv = new long[1]; 
    int result = COM.CoCreateInstance(guid, 0, COM.CLSCTX_INPROC_HANDLER | COM.CLSCTX_INPROC_SERVER | COM.CLSCTX_LOCAL_SERVER, 
      COM.IIDIDispatch, ppv); 
    if (result != COM.S_OK) 
     OLE.error(OLE.ERROR_CANNOT_CREATE_OBJECT, result); 
    init(new OleAutomation(new IDispatch(ppv[0]))); 
} 

調用失敗,並返回-2147221164,我的猜測是某種錯誤代碼指定相應的註冊表項不能被發現。

有些事情我已經試過包括:

有沒有人有此建議?

回答

5

CoCreateInstance正打算調用LoadLibraryEx,並且無法在64位進程中加載​​32位庫。時期,永遠。另一方面,您可以:

  1. 獲取com組件的合法64位副本。
  2. 創建您自己的非進程內COM服務器,然後調用您所擁有的COM服務器,並調用CoCreateInstance以獲取其ID。
  3. 創建一個包裝這個東西並使用java來調用它的Web服務。
  4. 回到32位Eclipse。
+1

對不起,但這是一個可怕的和令人沮喪的反應。這顯然不是不可能的:http://stackoverflow.com/questions/2925479/ways-to-wrap-32-bit-dll-so-it-will-work-in-a-64-bit-os – kwikness 2011-12-28 19:54:36

+1

@kwikness,對不起,不能在64位進程中加載​​一個32位庫,就這麼簡單。你可以把它包裝在一個32位的進程中,並通過RMI或任何你感覺你必須的東西進行交流。但是你不能在進程中加載​​它。 – bestsss 2011-12-28 20:08:10

+0

我從未指定我反對這樣的解決方案,但這對於一個SO帖子來說是非常沒有意義的智能標記。 感謝您的更新答案bmargulies。 – kwikness 2011-12-28 20:16:10

1

如果COM DLL是自動兼容的,您只需要設置DllSurrogate註冊表項。 COM子系統將啓動32位DllHost.exe,它將用作64位進程的out-proc COM服務器。

相關問題