2009-06-09 9 views
2

Je ai une application qui est écrit en C#Comment obtenir le ProgID d'un composant COM à partir de C#?

Je veux afficher une liste des composants COM dans un dossier sur le système avec des détails sur le composant, initialement le ProgID.

Existe-t-il un moyen d'interroger un composant à partir de mon code C# pour trouver les détails lors de l'exécution. Il se peut que vous deviez utiliser la classe TypeLibConverter et travailler avec les métadonnées du framework .net.

+0

Notez que pour tous les conseils en utilisant le registre (y compris ProgIDFromCLSID) le conmponet doit effectivement être enregistré. Qu'essayez-vous d'accomplir? La suggestion d'Alex de lire le typelib est probablement la plus générique, mais aussi la plus complexe. – peterchen

Répondre

1

Si vous avez absolument aucun autre détail d'exécution des composants COM à l'intérieur des DLL, vous pouvez lire et analyser la ressource de registre intégré dans la DLL. C'est ce qui est utilisé lors de l'enregistrement pour enregistrer le ProgID et le CLSID. Si vous connaissez certains détails d'exécution sur les composants COM (tels que les interfaces implémentées par les composants), il existe peut-être un moyen de revenir en arrière à travers le Registre. (Bien que je ne crois pas qu'il existe un moyen de le faire sans utiliser la méthode de la force brute ci-dessous.)

Ensuite, bien sûr, il y a la méthode de la force brute d'énumérer les arbres spécifiques dans le registre et correspondant aux chemins de la DLL dans les entrées serveur/gestionnaire.

1

Si vous avez accès à certaines interfaces dans cet objet COM - vous pouvez faire quelque chose comme ceci:

[DllImport("ole32.dll")] 
     static extern int ProgIDFromCLSID([In] ref Guid clsid, 
      [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID); 

     //... 

      Type t = someInterface.GetType(); 
      Guid tmpGuid = t.GUID; 
      string sProgID; 
      ProgIDFromCLSID(ref tmpGuid, out sProgID); 
Questions connexes