2011-01-10 4 views
3

This question은 32 비트 COM 클라이언트가 64 비트 COM 서버와 통신 할 수 있음을 나타냅니다. 서버가 out-of-process 인 경우). Java Com Bridge (JaCoB) 라이브러리를 사용하는 클라이언트를 구현하여이 방식으로 타사 out-of-process 서버와 통신하려고합니다. 이는 this question에 따라 가능해야합니다. 내가 사용 테스트 코드는 내가 프로세스 아키텍처 (32 비트 32 비트 또는 64 비트 64 비트에)와 일치하면 성공하지만,이 제외한 크로스 조합에 실패Java/JaCoB를 사용하여 out-of-proc 64 비트 서버와 통신하도록 32 비트 COM 클라이언트 가져 오기

Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered: 
At Invoke of: Execute 
Description: Invalid callee. 

    at com.jacob.com.Dispatch.invokev(Native Method) 
    at com.jacob.com.Dispatch.invokev(Dispatch.java:858) 
    at com.jacob.com.Dispatch.callN(Dispatch.java:455) 
    at com.jacob.com.Dispatch.call(Dispatch.java:544) 
    at com.jacob.activeX.ActiveXComponent.invoke(ActiveXComponent.java:447) 
    ... 

하나를 아이디어?


업데이트

예외를 디버깅 후 나는 기본 COM 오류가 DISP_E_BADCALLEE입니다 확신한다. 일부 웹 파기 후에 잘못된 메소드 서명이 가능한 원인을 발견 했으므로 여기에 몇 가지 세부 정보가 있습니다. COM 서버가 MATLAB이고 Execute 및 메서드를 호출하려고합니다. 다음은 OLE 형식의 COM 유형 시그니처입니다.

BSTR _stdcall Execute ([in] BSTR Name);
void _stdcall Quit();

그리고 여기 내 테스트 코드입니다 : 우리는 현재 COM 액세스 제어에 대한 Com4J을 사용하여 우리의 응용 프로그램에서

public static void main(String[] args) { 
    ActiveXComponent ml = new ActiveXComponent("Matlab.Application.Single.7"); 
    System.out.println(ml.invoke("Execute","version")); 
    ml.invoke("Quit"); 
    ml.safeRelease(); 
} 

답변

1

,하지만 난을 제대로 이해한다면 우리는 (일부 ActiveX 컨트롤이 제대로 발송 기능을 구현 한 것으로 나타났습니다 우리가 사용하는 경우), 그래서 우리는 각각의 제어를 선택해야합니다 :

  • Com4J는 COM 컨트롤에 직접
  • VB6 래퍼 액세스하기 위해, 이는에 COM 컨트롤을 참조하지만, 우리는 우리가 부르는 방법에 대해 래퍼를 노출하고, SWT COM brigde입니다

    • 내장 Com4J
    • 에서 OLE에 대한

    또는 그 전화를해야합니다.

저는 Jacob과 함께 일 했었습니다. (적어도 전에 시도한 ActiveX 컨트롤에서는) 매우 불안정한 것 같았습니다.

+0

그게 내가 두려워했던거야, 정보 주셔서 감사합니다. –