2014-04-29 6 views
4

Ma société a créé plusieurs objets COM et les utilisait avec bonheur depuis .NET. Mais maintenant, notre client veut passer à Java. Je pensais qu'il serait intéressant d'utiliser JACOB ou j-interop (je ne sais pas lequel d'entre eux) pour certaines tâches, mais le code résultant est assez ingérable. Je veux donc écrire un outil capable de lire la TypeLib de la bibliothèque COM, puis générer des classes wrapper Java pour cacher tout ce code ingérable. Je suis un novice dans le monde COM, donc je ne sais pas comment obtenir les informations sur les interfaces, les méthodes et les paramètres qui décrivent un objet COM. J'ai lu quelque chose appelé TypeLib, mais je ne sais pas comment le lire. Comment puis-je obtenir des informations?Comment lire COM TypeLib avec C# ou C++?

Répondre

4

L'API officielle est disponible ici: Type Description Interfaces.

Vous pouvez l'utiliser directement depuis C++ mais je vous suggère d'utiliser .NET (C# dans mon exemple) avec un outil supplémentaire que Microsoft a écrit il y a longtemps (le mien date de 1997), nommé TLBINF32.DLL. C'est aussi un objet COM mais est compatible avec Automation (VBScript, Javascript, VB/VBA) et .NET.

Vous pouvez trouver le googling TLBINF32.DLL pour cela (ce lien semble fonctionner aujourd'hui: tlbinf32.dll download, assurez-vous que vous obtenez le fichier .ZIP, pas ce qu'ils appellent le "fixateur" ...). Notez qu'il s'agit d'une DLL 32 bits, donc votre programme doit être compilé en 32 bits pour pouvoir l'utiliser. Je ne connais aucune version 64 bits.

L'utilisation de cette bibliothèque est expliquée en détail dans l'article du magazine MSDN de décembre 2000: Inspect COM Components Using the TypeLib Information Object Library. C'est orienté VB (pas .NET), mais il est assez facile à traduire en termes .NET.

Voici une application console exemple en C# qui déverse simplement toutes les informations de type d'un type lib (ici Mshtml.tlb):

class Program 
{ 
    static void Main(string[] args) 
    { 
     TypeLibInfo tli = new TypeLibInfo(); 
     tli.ContainingFile = @"c:\windows\system32\mshtml.tlb"; 
     foreach (TypeInfo ti in tli.TypeInfos) 
     { 
      Console.WriteLine(ti.Name); 
      // etc... 
     } 
    } 
}