2010-11-30 7 views
1

Tlb-Datei (mit regasm) wird von einer DLL (mit C# -Code) gemacht, und ich kann dies in C++ mit #import verwenden. und alles funktioniert gut. Gibt es einen Weg, ich kann das in C Sprache verwenden? Ich habe gerade herausgefunden, dass #import C++ - spezifisch ist. Also, kann mir bitte jemand sagen, wie kann ich in meinem C-Programm verwenden?Wie tlb-Datei in C verwenden?

meine Hauptabsicht ist COM-DLL zu verwenden, die in C# in meinem C-Programm entwickelt wurde.

Dank & Rgds, ~ calvin

+0

i bekommen c2773 Fehler: #import und # using nur in C++ Compiler verfügbar – rplusg

Antwort

7

COM-Programmierung in C ist sehr schmerzhaft, aber nicht unmöglich. Der Dollar bleibt hier jedoch stehen. Der Punkt einer Typbibliothek besteht darin, dass ein Tool die COM-Schnittstelle und die Co-Klassen-Deklarationen automatisch generiert, damit Sie sie in Ihrem Code verwenden können. Ziemlich ähnlich wie eine .h-Datei, aber sprachunabhängig. Das .NET-Äquivalent ist die Metadaten in einer Assembly.

Problem ist, das Werkzeug ist nicht verfügbar, um eine TLB in C-Deklarationen zu konvertieren. Ich bin sicher, dass Sie mit #import vertraut sind, das wird in MSVC verwendet. Aber es erzeugt C++ - Code, intelligente Zeiger, die Ihnen helfen, das COM-Objekt zu erstellen, seine Schnittstellenmethoden aufzurufen und mit Fehlern umzugehen. Wenn es ein Werkzeug gibt, das C generiert, dann ist es ein sehr gut verstecktes Geheimnis.

Ein Trick springt in den Sinn, können Sie OleView.exe, File + View TypeLib verwenden, um den Inhalt der Typbibliothek anzuzeigen. Diese Sicht wird in IDL, der Schnittstellendefinitionssprache, dekompiliert. Sie können diesen Text kopieren und in eine .idl-Datei einfügen und mit midl.exe mit der Befehlszeilenoption/header kompilieren. Das generiert eine H-Datei, die C++ - und die C-Deklarationen für die Schnittstellen enthält. Um Sie näher zu bringen, stellen Sie sicher, dass die Typbibliothek einigermaßen stabil ist, so dass Sie dies nicht sehr oft tun müssen.

+0

danke für die Erkenntnisse. Und c-Dateien und h-Dateien können aus Oleviewer generiert werden. Aber wenn ich dann einschließe, bekomme ich viele Fehler. Macht keinen Sinn. – rplusg

+0

Nur Echo dies. Sie können sagen, dass Sie dies tun wollen (COM mit C), aber Sie nicht. – Joe

-2

Sie regasm with /tlb option die Typen in Windows-Registry registrieren können. Danach können Sie Ihre Instanzen wie normale COM-Aufrufe aus C++ - Code erstellen.

Von 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

Danke für die Antwort, aber ich möchte es von C, nicht C++ verwenden. Entschuldigung, wenn ich nicht in Frage komme. – rplusg

0

Weder C noch C++ eine #import Präprozessordirektive haben.

+1

Es ist eine Microsoft-Erweiterung http://msdn.microsoft.com/en-us/library/8etzzkb6(VS.71).aspx – JeremyP

0

ich sah sich auch das gleiche Problem wie ich TLB-Datei in C verwenden müssen, und ich denke, man kann den folgenden Link überprüfen, die

How to call a COM component in C

Dank hilft, sveerap