2011-12-28 3 views
3
내가 64 비트 자바 라이브러리를 통해 CoCreateInstance를 (...)를 호출하기 위해 노력하고있어

: org.eclipse.swt.internal에게 .ole.win32.COM. 연결하려고하는 DLL은 Visual SourceSafe 용 DLL입니다. 이 프로젝트의 요점은 32 비트 Eclipse 용으로 만든 VSS 플러그인 (http://sourceforge.net/projects/vssplugin/)을 64 비트 Eclipse로 이식하는 것입니다. 내가 org.eclipse.swt.internal.ole.win32.COM의 64 비트 버전을 사용하는 경우64 비트 자바 응용 프로그램에서 32 비트 COM DLL을 액세스 (레지스트리 항목을 찾을 수 없습니다)

통화가 잘 작동하지만 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를 그냥 함 2 LoadLibraryEx 호출하려고하고, 그 64 비트 과정에서 32 비트 libs와로드 할 수있다. 기간. 반면에 다음과 같이 할 수 있습니다.

  1. com 구성 요소의 합법적 인 64 비트 복사본을 얻을 수 있습니다.
  2. 자신이 소유 한 not-in-process COM 서버를 만들어 차례대로 호출하고 자신의 ID로 CoCreateInstance를 호출합니다.
  3. 이 것을 랩핑하고 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

나는 그런 해결책에 반대한다는 것을 결코 언급하지 않았지만, 이것은 한 가지 SO 게시물에 대해 충분히 무의미한 똑똑한 표식입니다. 업데이트 된 답변 bmargulies 주셔서 감사합니다. – kwikness

1

COM DLL이 자동화와 호환되는 경우 DllSurrogate 레지스트리 항목 만 설정하면됩니다. COM 하위 시스템은 64 비트 프로세스의 out-proc COM 서버 역할을하는 32 비트 DllHost.exe를 시작합니다.