2016-04-14 3 views
1

J'utilise la bibliothèque JACOB (Java COM Bridge) pour appeler des objets COM enregistrés depuis mon système d'exploitation Windows. Il m'a fallu du temps avant de comprendre comment fonctionne JACOB et de tout mettre en place. Donc, mon problème actuel est que:Qu'est-ce qu'une structure COM valide pour la bibliothèque JACOB?

ActiveXComponent comp = new ActiveXComponent("iTunes.Application"); 

par exemple fonctionne, mon iTunes démarre correctement, etc. Si je veux appeler un auto généré et enregistré objet COM écrit en C# JACOB répond en l'erreur suivante:

Exception in thread "main" com.jacob.com.ComFailException: Can't co-create object 

que mon iTunes a commencé était un indicateur pour moi que tout est mis en place à droite, je ne sais pas pourquoi JACOB ne peut pas appeler mon propre .dll

Actuellement, je suis en utilisant Visual studio 2015 Surchauffe registre pour COM interop fonction qui a travaillé p Retty bien dans le passé pour moi. L'objet COM se présente comme suit:

[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")] 
public interface ComClass1Interface 
{ 
} 

[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface ComClass1Events 
{ 
} 

[ComVisible(true)] 
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ComClass1Events))] 
[ProgId("test.Application")] 
public class ComClass1 : ComClass1Interface 
{ 
} 

quelque chose de mal avec mon dll C# ou ne JACOB besoin d'un certain type de structure dans cette dll?

Malheureusement, je n'ai trouvé aucun exemple COM pour JACOB.

Merci d'avance.

EDIT:

Si je change ma première ligne à:

ActiveXComponent comp = new ActiveXComponent("CLSID:{C9888A8E-8D23-4185-9D7D-A1E0B812803D}"); 

Je reçois suivante Exception:

Exception in thread "main" com.jacob.com.ComFailException: Can't find moniker 

Mon .dll doit être enregistré si.

Répondre

1

Merci pour l'astuce, j'ai pu trouver une solution:

Visual Studio apparemment enregistré mon COM-objet comme 32 bits. Je ne suis pas sûr s'il s'agit d'un paramètre par défaut (?).

Ainsi deux étapes simples pour résoudre le problème:

  1. ouvrir vos fenêtres cmd en tant qu'administrateur.
  2. Exécutez la commande suivante:

    C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ RegAsm.exe/« chemin de votre dll » verbose/nologo/codebase

La commande enregistre la .dll 64 bits et non 32. Cela a résolu le problème pour moi et je ne pouvais l'utiliser via JACOB.

1

Je voudrais d'abord écrire un programme VBS (script VB) pour tester votre DLL et assurez-vous qu'il s'exécute.

set obj = CreateObject("test.application") 
MsgBox TypeName(obj) 

Assurez-vous que cela fonctionne. Si cela échoue, alors (en supposant un système d'exploitation 64 bits), essayez de l'exécuter avec le chemin c: \ windows \ syswow64 \ wscript.exe \ vers \ votre \ script.vbs.

Vérifiez que votre processus Java est un processus 64 bits ou 32 bits. Votre DLL C# doit être enregistrée avec le même bit-ness que votre processus Java pour réussir.