Question

J'ai un problème étrange à l'aide de Jacob à partir de deux au départ des threads identiques.J'ai une classe d'utilité qui utilise un champ Static ActiveXObject pour avoir envoié diverses demandes au WMI.Le premier fil fonctionne bien.Lorsque le deuxième fil est démarré, je reçois l'exception suivante:

com.jacob.com.ComFailException: Can't map name to dispid: ExecQuery
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:510)
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:111)
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:104)
at WindowsInfoCollector.getConnectionInfo(WindowsInfoCollector.java:516)
at WindowsInfoCollector.collect(WindowsInfoCollector.java:118)
at DiagnosisExecutor.execute(DiagnosisExecutor.java:128)
at DiagnosisExecutor.run(DiagnosisExecutor.java:160)
at java.lang.Thread.run(Thread.java:662)

Le fil est démarré par un clic de souris depuis une interface graphique, mais l'erreur est reproductible manuellement:

        DiagnosisExecutor dex = new DiagnosisExecutor();
        Thread thread1 = new Thread(dex);
        Thread thread2 = new Thread(dex);

        thread1.start();
        thread1.join();
        Thread.sleep(1000);
        thread2.start();

Il me semble que certaines ressources allouées ne sont pas libérées correctement lorsque le fil qui les utilise se termine.Toute astuce?

mise à jour: JACOB version 1.14.3

Était-ce utile?

La solution

Je n'ai pas utilisé la dernière version de Jacob avec son nouveau modèle de threading, mais les versions plus anciennes étaient définitivement pas Safe Safe.À partir de la version 1.7> Ils ont amélioré le modèle de threading pour mieux refléter les composants COM sous-jacents, mais vous devez déterminer si ledit composant est MTA ou STA, puis initialiser les classes JACOB de manière appropriée.Reportez-vous au Documentation JACOB pour adapter correctement votre application en fonction de ses exigences.

Autres conseils

J'ai commencé à avoir un problème similaire (première exécution OK, deuxième échec avec Impossible de co-créer un objet), lorsque j'ai commencé à définir le même nom de thread sur plusieurs threads.Ajout d'un numéro séquentiel sous forme de suffixe au nom du thread résolu le problème pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top