2017-08-30 2 views
0

Haben Sie eine seltsame Frage; Ich benutze ein Werkzeug von einer großen Firma, die aus Gründen, die ich etwas verwirrend finde, eine COM-Schnittstelle verwendet, die in der EXE selbst definiert ist. In dem von ihnen bereitgestellten Beispielcode sieht es so aus.COM exe, C++ und MinGW

#import "C:\\Path_To_Exe\\the.exe" rename_namespace ("exe_namespace");

Von dem, was ich verstehe, ist dies die Art und Weise Microsoft Visual C++ Compiler die COM und arbeitet mit ihr versteht, und ich habe den Beispielcode arbeiten vor (zur Zeit hatte, es nicht kompiliert aufgrund Hantieren mit meiner Build-Umgebung).

Meine Frage ist, gibt es eine Möglichkeit, das gleiche mit MinGW zu tun? Das Projekt, an dem ich arbeite, benutzt das hauptsächlich; Wir können MSVC bei Bedarf verwenden, aber ich würde es idealerweise vermeiden, wenn möglich mehrere Compiler zu verwenden. Momentan benutze ich cmake, um mit zu bauen, aber ich bin bereit, ein Skript zu verwenden, um die Elemente zu erstellen, die bei Bedarf die COM-Schnittstelle benötigen.

Danke für Ihre Zeit.

+0

Sie können alle notwendigen COM-Schnittstellen neu deklarieren. Sie sollten in der Lage sein, dies auch in einfacher C zu tun. Obwohl es scheint, als wäre dies nur eine Verschwendung von Zeit und Sie sollten stattdessen Visual Studio verwenden. – VTT

+0

Dies ist eher üblich für COM-Schnittstellen. Es gibt keinen Grund, warum eine MinGW-Anwendung dasselbe nicht tun kann. Der Vorteil von MSVC besteht darin, dass es Code-Generierungstools und die MIDL-Sprache bietet, die ziemlich viel helfen. Eine Google-Suche von "msdn register com interface" liefert Ihnen Details darüber, wie Sie die Funktionalität von Hand bereitstellen können. –

+0

['# import'] (https://msdn.microsoft.com/en-us/library/8etzzkb6.aspx) impliziert, dass die Datei eine COM-Typbibliothek ist. Sie können dies über den alten [COM/OLE-Viewer] (https://msdn.microsoft.com/en-us/library/d0kh9f4c.aspx) prüfen und den Schnittstellencode kopieren. Wie ich mich erinnere, ist das Arbeiten mit COM/OLE über den g ++ - Compiler nicht sehr praktisch. –

Antwort

1

Das COM-Subsystem ist Teil der Windows-API und Sie können mit C-Aufrufen auf diese API zugreifen.

Allerdings gibt es eine große Menge an Boilerplate beteiligt. Die Compiler, die COM "out of the box" unterstützen, haben all diese Textbausteine ​​geschrieben und in einer Kombination aus kompilierten Bibliotheken, Vorlagenheadern und so weiter verpackt.

Ein anderer Teil der üblichen Suite von Tools, die von diesen Compilern angeboten werden, ist einer, der COM-Schnittstelle-Definitionen aus einem vorhandenen kompilierten Objekt lesen kann. Aus diesem Grund enthalten COM-Objekte normalerweise eine binäre Darstellung ihrer Schnittstelle.

Es gibt einige Möglichkeiten, wie Sie hier vorgehen können, um g ++ zu verwenden; Eine Option folgt diesem groben Überblick:

  • Verwenden Sie Ihre MSVC-Installation, um das COM-Objekt zu lesen und eine C-Header-Datei zu erstellen, die die Schnittstelle beschreibt.
  • Wählen Sie die Aufzählungen und GUIDs aus dieser Headerdatei aus.
  • Verwenden Sie in g ++ das Windows-API zum Aufrufen des Objekts unter Verwendung dieser Aufzählungen und GUIDs.
  • Wenn Sie Objekte in g ++ erstellen möchten, dann gibt es viel mehr zu tun, als Sie eine Menge Dinge implementieren müssen, aber es ist möglich.

    Ich habe dies in der Vergangenheit erfolgreich mit g ++ (als Teil des Testens von COM-Objekten, die ich entwickelt habe) gemacht. Wahrscheinlich jemand könnte entwickeln eine schöne Open-Source-Suite für die Verwendung von COM-Objekten oder sogar für die Authoring, die nicht von MSVC abhängt, aber ich bin mir nicht bewusst, so etwas.

    Ich würde empfehlen, die Bücher von Don Box zu lesen, sie füllen eine Menge Lücken im Verständnis, dass Sie haben, wenn Sie nur über COM gelernt haben, indem Sie damit arbeiten und das Internet lesen.

    0

    Die Antwort auf "gibt es eine Möglichkeit, das gleiche mit MinGW zu tun" ist nein. #import ist ein optionales Tool, das eine COM type library liest (eingebettet in eine Binärdatei oder nicht, der TLB entspricht im Allgemeinen einer .idl-Datei, aber auch optional) und generiert C/C++ - Code, der stark davon abhängig ist. c und .h-Dateien, die nur Visual Studio bereitstellt.

    Die Antwort auf "kann ich COM mit MinGW tun" ist natürlich ja.Ich weiß nicht viel über MinGW und Tools, aber Sie können COM mit jedem Compiler tun, da COM (nur) eine binary standard ist.

    Wenn Sie #import loswerden, müssen Sie den Code ändern, der das verwendet, was generiert wurde (in der .TLH-Datei resultierend aus der Anweisung #import), COM Helfer, Wrapper, etc. Es kann ein sein viel Arbeit, aber es ist technisch möglich.

    Nun, in Ihrem Kontext, nehme ich an, es hängt wirklich davon ab, wie groß die .exe Typbibliothek (die Beschreibung Ihrer COM-Klassen, Schnittstellen, etc.) ist. Visual Studio's #import fügt Wert hinzu, also müssen Sie bewerten, wie viel Wert es für Sie hinzugefügt hat.

    Wenn es nur eine Klasse ist, eine Schnittstelle zum Beispiel, dann kann es interessant sein, den #import loszuwerden. Wenn die .exe-Datei bereits .h-Dateien enthält, die der TLB entsprechen, können Sie sie verwenden, anderenfalls müssen Sie einige selbst dekodieren (und wiederum den Code ändern, der generierte Wrapper verwendete).

    Die einzige Tatsache, dass Sie die Frage stellen, fragt mich, ob Sie genug Kenntnisse von COM haben (nichts für ungut :-), um Visual Studio loszuwerden.