2011-12-28 38 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服务器。

相关问题