从64位Java应用程序访问32位COM DLL(找不到注册表项)

3
我正在尝试通过一个64位Java库org.eclipse.swt.internal.ole.win32.COM调用CoCreateInstance(...)。我要连接的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,我猜这是某种错误代码,指定相应的注册表项找不到。
我尝试过的一些方法包括: 有人能给出建议吗?
2个回答

5

CoCreateInstance仅仅会调用LoadLibraryEx函数,而该函数无法在64位进程中加载32位库。这是绝对的事实。不过,您可以采用以下方法:

  1. 获取合法的64位组件拷贝。
  2. 创建自己的非进程内COM服务器,然后调用您已有的COM组件并使用其ID调用CoCreateInstance。
  3. 创建一个封装此组件的Web服务,并使用Java来调用。
  4. 回到32位Eclipse。

1
抱歉,但那是一个糟糕且令人沮丧的回答。很明显这并不是不可能的:https://dev59.com/Gk7Sa4cB1Zd3GeqP0hMW - kwikness
1
@kwikness,不管你是否抱歉,你都无法在64位进程中加载32位库,就是这么简单。你可以将其包装在32位进程中,并通过RMI或其他任何你认为必须的方式进行通信。但你不能在进程内加载它。 - bestsss
我从未表示反对这样的解决方案,但这篇SO帖子中已经有足够多的无意义的聪明话了。感谢您的更新答案,bmargulies。 - kwikness

1
如果COM DLL支持自动化,您只需要设置DllSurrogate注册表项。 COM子系统将启动32位的DllHost.exe,它将作为您的64位进程的外部进程COM服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接