2010-05-03 7 views
0

J'essaie d'utiliser JACOB pour interagir avec un objet COM.JACOB (Java/COM/ActiveX) - Comment dépanner la gestion des événements?

J'ai été capable d'invoquer une méthode d'initialisation sur l'objet (et d'obtenir ses propriétés), mais je ne récupère aucun événement. Le code est cité ci-dessous.
J'ai un exemple de page HTML + Javascript (fonctionnant dans IE) qui reçoit avec succès les événements du même objet.
J'envisage les options suivantes, mais apprécierais toutes les idées de dépannage en béton ...

  • Envoyer mon programme Java à l'équipe qui a développé l'objet COM, et ont les recherchent quelque chose de suspect sur leur côté (ne l'objet ont une façon de savoir s'il y a un client écoute de ses événements, et si elles ont été livrées avec succès?)

  • Mettez-vous dans les parties natives de JACOB et essayer de déboguer de ce côté. C'est un peu effrayant étant donné que mon C++ est rouillé et que je n'ai jamais programmé pour Windows.

 
public static void main(String[] args) { 
    try { 
     ActiveXComponent c = new ActiveXComponent(
           "CLSID:{********-****-****-****-************}"); // My object's clsid 
     if (c != null) { 
      System.out.println("Version:"+c.getProperty("Version")); 
      InvocationProxy proxy = new InvocationProxy() {     
       @Override 
       public Variant invoke(String methodName, Variant[] targetParameters) { 
        System.out.println("*** Event ***: " + methodName); 
        return null; 
       } 
      }; 
      DispatchEvents de = new DispatchEvents((Dispatch) c.getObject(), proxy); 
      c.invoke("Init", new Variant[] { 
        new Variant(10), //param1 
        new Variant(2), //param2 
        }); 
      System.out.println("Wating for events ..."); 
      Thread.sleep(60000); // 60 seconds is long enough 
      System.out.println("Cleaning up ..."); 
      c.safeRelease(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     ComThread.Release(); 
    } 
} 

Répondre

1

est ici la solution à mon problème spécifique:

Il est avéré que l'objet COM a été écrit sous la forme d'un contrôle ActiveX invisible qui suppose qu'il est en cours d'exécution dans le cadre d'une fenêtre. Cela a été "découvert" par l'équipe de développement du composant après leur avoir donné le programme basé sur JACOB.

Fournir le contexte de la fenêtre est quelque chose que JACOB ne semble pas faire.

La solution dans notre cas sera de se débarrasser de COM (et d'utiliser JNA pour appeler directement les fonctions C dans la DLL native).

1

Un moyen facile de résoudre les événements se tourne Jacob débogage sur, en exécutant java avec l'option com.jacob.debug=true:

java -Dcom.jacob.debug=true ... 

Tous les événements reçus sont présentés en cas d'erreur standard (ou de sortie):

Thread-0: InvocationProxy: trying to invoke Change on [email protected] 
Thread-0: InvocationProxy: listener ([email protected]) doesn't implement Change