2011-12-28 24 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にアクセスする(レジストリエントリが見つかりません)

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を返します。

私が試したいくつかのもの

が含まれます:

誰にもこれに関するアドバイスがありますか?

答えて

5

CoCreateInstanceはLoadLibraryExを呼び出すだけで、64ビットプロセスで32ビットのライブラリをロードすることはできません。期間、これまで。一方、

  1. comコンポーネントの正当な64ビットコピーを取得することができます。
  2. 独自のノン・イン・プロセスCOMサーバーを作成し、これを取得したCOMサーバーで取得したIDを取得するためにCoCreateInstanceを呼び出します。
  3. これをラップするWebサービスを作成し、javaを使用して呼び出します。
  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

+1

@kwikness、申し訳ありませんが、64ビットプロセスで32ビットのlibを読み込むことはできません。 32ビットプロセスでラップして、RMIやあなたの気持ちを伝えることができます。しかし、インプロセスで読み込むことはできません。 – bestsss

+0

私はそのような解決策に反対していることは一度も言いませんでしたが、これは1つのSOのポストのために非常に無意味なスマート・アレックです。 更新された返信用bmarguliesありがとうございます。 – kwikness

1

COM DLLが自動化互換の場合は、DllSurrogateレジストリエントリを設定するだけです。 COMサブシステムは、64ビットプロセス用のout-proc COMサーバーとして機能する32ビットDllHost.exeを開始します。

関連する問題