我試圖通過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,我的猜測是某種錯誤代碼指定相應的註冊表項不能被發現。
有些事情我已經試過包括:
- 此註冊表黑客:http://www.gfi.com/blog/32bit-object-64bit-environment/
- 取消註冊/註冊與regsvr32.exe的32位和64位版本的DLL
有沒有人有此建議?
對不起,但這是一個可怕的和令人沮喪的反應。這顯然不是不可能的: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
@kwikness,對不起,不能在64位進程中加載一個32位庫,就這麼簡單。你可以把它包裝在一個32位的進程中,並通過RMI或任何你感覺你必須的東西進行交流。但是你不能在進程中加載它。 – bestsss 2011-12-28 20:08:10
我從未指定我反對這樣的解決方案,但這對於一個SO帖子來說是非常沒有意義的智能標記。 感謝您的更新答案bmargulies。 – kwikness 2011-12-28 20:16:10