我试图通过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