2010-11-30 6 views
1

Le fichier tlb (en utilisant regasm) est créé à partir d'une DLL (en utilisant le code C#), et je peux l'utiliser en C++ en utilisant # import. et tout fonctionne bien. Existe-t-il un moyen, je peux l'utiliser en langage C? Je viens de trouver que # import est spécifique à C++. Alors, quelqu'un peut-il me dire comment utiliser mon programme C?Comment utiliser le fichier tlb en C?

mon intention principale est d'utiliser COM DLL développé en C# dans mon programme C.

Merci & MFG, ~ calvin

+0

je reçois c2773 erreur: #import et #using disponibles uniquement dans le compilateur C++ – rplusg

Répondre

7

La programmation COM en C est très douloureuse, mais pas impossible. La balle s'arrête ici cependant. Le but d'une bibliothèque de types est de disposer d'un outil qui génère automatiquement l'interface COM et les déclarations de classe de sorte que vous puissiez les utiliser dans votre code. Tout à fait similaire à un fichier .h, mais indépendant du langage. L'équivalent .NET correspond aux métadonnées d'un assembly.

Le problème est que l'outil n'est pas disponible pour convertir une déclaration .tlb en C. Je suis sûr que vous connaissez #import, c'est ce qui est utilisé dans MSVC. Mais il génère du code C++, des pointeurs intelligents qui vous aident à créer l'objet COM, appellent ses méthodes d'interface et traitent les erreurs. S'il y a un outil disponible qui génère C alors c'est un secret très bien caché.

Un truc saute à l'esprit, vous pouvez utiliser OleView.exe, File + View TypeLib pour afficher le contenu de la bibliothèque de types. Cette vue est décompilée en IDL, le langage de définition d'interface. Vous pouvez copier et coller ce texte dans un fichier .idl et le compiler avec midl.exe avec l'option de ligne de commande/header. Cela génère un fichier .h contenant à la fois les déclarations C++ et C pour les interfaces. Pour vous rapprocher, assurez-vous que la bibliothèque de types est raisonnablement stable, donc vous n'avez pas besoin de le faire très souvent.

+0

merci pour les idées. Et les fichiers c et les fichiers h peuvent être générés à partir de oleviewer. Mais quand je l'inclut, j'ai beaucoup d'erreurs. Ça n'a aucun sens. – rplusg

+0

Juste en écho. Vous pouvez dire que vous voulez faire cela (COM avec C) mais vous ne le faites pas. – Joe

-2

Vous pouvez utiliser regasm with /tlb option pour enregistrer les types dans le registre Windows. Après cela, vous pouvez créer vos instances comme les appels COM réguliers à partir du code C++.

De MSDN:

When you specify the /tlb option, Regasm.exe generates and registers a type library describing the types found in the assembly. Regasm.exe places the generated type libraries in the current working directory or the directory specified for the output file. Generating a type library for an assembly that references other assemblies may cause several type libraries to be generated at once. You can use the type library to provide type information to development tools like Visual Studio 2005. You should not use the /tlb option if the assembly you are registering was produced by the Type Library Importer (Tlbimp.exe). You cannot export a type library from an assembly that was imported from a type library. Using the /tlb option has the same effect as using the Type Library Exporter (Tlbexp.exe) and Regasm.exe, with the exception that Tlbexp.exe does not register the type library it produces. If you use the /tlb option to registered a type library, you can use /tlb option with the /unregister option to unregistered the type library. Using the two options together will unregister the type library and interface entries, which can clean the registry considerably.

+0

merci pour la réponse, mais je veux l'utiliser de C, pas C++. Désolé si je ne suis pas clair en question. – rplusg

0

Ni C ni C++ ont une directive préprocesseur #import.

+1

Il s'agit d'une extension Microsoft http://msdn.microsoft.com/en-us/library/8etzzkb6(VS.71).aspx – JeremyP

0

J'ai aussi fait face au même problème que je dois utiliser TLB fichier C. Et je pense que vous pouvez vérifier le lien ci-dessous qui aide

How to call a COM component in C

Merci, sveerap

Questions connexes