Ottenere un client COM a 32 bit per parlare a un server out-of-process a 64 bit utilizzando Java / JACOB

StackOverflow https://stackoverflow.com/questions/4648943

Domanda

Questa domanda indica che è possibile per un 32-bit client COM di parlare con un server COM a 64 bit (e viceversa), a condizione che il server è out-of-process. Sto cercando di implementare un client utilizzando il COM Java Bridge (Jacob) libreria per parlare con un terzo out-of-process del server in questo modo, che dovrebbe essere possibile secondo questa domanda . Il codice di prova sto usando riesce se Abbino le architetture di processo (32 bit a 32 bit o 64 bit a 64 bit), ma non riesce per qualsiasi combinazione croce con questa eccezione:

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)
    ...

Tutte le idee?


Aggiorna

Dopo il debug eccezione Sono abbastanza certo l'errore COM sottostante è DISP_E_BADCALLEE . Dopo un po 'di scavo web ho scoperto una possibile causa è un metodo di firma non valida, per cui qui sono alcuni dettagli. Il server COM è MATLAB, e sto provando a chiamare i metodi Execute e Quit. Qui ci sono le loro firme di tipo COM (da OLEVIEW):

  

BSTR _stdcall Execute ([in] BSTR Nome);
  vuoto _stdcall Quit ();

E qui è il mio codice di prova:

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();
}
È stato utile?

Soluzione

Nella nostra applicazione abbiamo attualmente utilizzare Com4J per controllo di accesso COM, ma abbiamo notato che alcuni controlli ActiveX sono mal funzioni di invio implementato (se ho capito correttamente questo) quindi dobbiamo scegliere per ogni controllo se usiamo:

  • Com4J per l'accesso direttamente
  • Un VB6 Wrapper al controllo COM, in cui il controllo COM viene fatto riferimento, ma dobbiamo esporre wrapper per i metodi che chiamiamo, e chiamare quelli Com4J

o, per incorporamento OLE

  • La SWT COM Brigde.

Ho lavorato con Jacob prima, ma sembrava di essere molto instabile (almeno per i controlli ActiveX ho provato qualche tempo fa).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top