簡體   English   中英

從64位Java應用程序訪問32位COM DLL(找不到注冊表項)

[英]Accessing a 32-bit COM DLL from a 64-bit Java Application (Registry Entry Not Found)

我試圖通過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位版本的org.eclipse.swt.internal.ole.win32.COM時,調用工作正常,但是對於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,我猜這是某種錯誤代碼,指定無法找到相應的注冊表項。

我嘗試過的一些事情包括:

有沒有人對此提出建議?

CoCreateInstance只是調用LoadLibraryEx,並且無法在64位進程中加載​​32位庫。 期間,永遠。 另一方面,你可以:

  1. 獲取com組件的合法64位副本。
  2. 創建您自己的進程內COM服務器,然后調用您已獲得的服務器,並調用CoCreateInstance作為其ID。
  3. 創建一個包裝此東西並使用java來調用它的Web服務。
  4. 回到32位Eclipse。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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