6 Stimmen

Wie definiert man die Implementierung einer COM-Koklasse?

Ich bin neu in COM, und ich schaute auf dem Internet zu finden, wie eine COM-Klasse in C++ (von C # verwendet werden) zu erstellen. Ich habe gesehen, dass in der .idl-Datei, ich muss etwas wie dieses setzen:

[
object,
uuid(a93164ee-e6d4-44be-aa27-f00ce6972719),
helpstring("interface ITopologyQuery")
]

interface ITopologyQuery : IUnknown
{
  HRESULT LoadFile(BSTR completeFileName);

  HRESULT SetParameters(int above, int percentage);
}

[
  uuid(a958f2af-8b55-43c4-9fc3-c39d83fc1376)
]
library TopologyQueryLib
{
  [
    uuid(cc814992-31ec-4a1f-a41e-111ade27bdfe),
    helpstring("TopologyQuery class")
  ]
  coclass CTopologyQuery
  {
    [default] interface ITopologyQuery;
  };
}

Meine Frage ist nun, wo Sie die CTopologyQuery-Klasse definieren? Wenn ich sie als normale C++-Klasse in einer anderen Datei definiere, wird der Compiler meine Klasse dann korrekt mit der Schnittstelle verknüpfen? Der Code der C++-Klasse sieht wie folgt aus (sie ist in einer .cpp-Datei implementiert):

class CTopologyQuery : public ITopologyQuery
{
  public:

    __stdcall CTopologyQuery();

    //IUnknown interface 
    HRESULT __stdcall QueryInterface(REFIID riid, void **ppObj);
    ULONG   __stdcall AddRef();
    ULONG   __stdcall Release();

    //ITopologyQuery interface
    HRESULT __stdcall LoadTopologyFile(BSTR completeFileName);
    HRESULT __stdcall SetParameters(int above, int percentage);

  private:
};

Im Moment kompiliert es entweder, wenn ich den Bibliotheksabschnitt in die .idl-Datei einfüge oder nicht. Ich bin ein wenig ratlos, was ist hier das Richtige zu tun? Ich verstehe, dass die Coklassendefinition der Schnittstelle eine Standardimplementierung geben soll, aber für mich sieht es aus wie eine leere Klasse ohne Methoden...

6voto

Cheers and hth. - Alf Punkte 138555

Der IDL-Teil (Interface Definition Language) definiert die binäre Schnittstelle auf eine sprachunabhängige Weise, die C++ sehr ähnlich ist.

Es wird im Allgemeinen verwendet, um eine Binärdatei zu erstellen. Typenbibliothek die eine DLL mit Informationen über Ihre COM-Klasse ist. Sie können den COM/OLE Viewer von Microsoft verwenden, um vorhandene Typbibliotheken zu durchsuchen.

Für den C++ Verbrauch Ihrer nicht IDispatch COM-Klasse brauchen Sie diese Informationen über Ihre Klasse nicht, da alles, was der C++-Compiler (mindestens) wissen muss, in Ihrer C++-Header-Datei steht.

Aber die IDL-Beschreibung und die daraus generierte Typbibliothek helfen dabei, den Glue-Code für die Verwendung Ihrer COM-Klasse aus C zu generieren # und andere Sprachen. Wenn ich mich recht erinnere, kann es auch helfen, die Windows-Registrierungsschlüssel und -werte zu generieren, die für die Verwendung Ihrer COM-Klasse über CoCreateInstance und Freunde. Es handelt sich also sozusagen um eine Art Infra-Struktur-Maschinerie, die im Wesentlichen eine sprachunabhängige Ansicht und Verwendung Ihrer COM-Klasse unterstützt.

Prost & hth.,

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X