Freigeben über


Compilerfehler C3706

"Funktion" : muss eine COM-Schnittstelle sein, um COM-Ereignisse auszulöschen

Die Ereignisschnittstelle, die Sie zum Auslösen von COM-Ereignissen verwenden, muss eine COM-Schnittstelle sein. In diesem Fall sollte die Schnittstelle entweder mit einem Visual C++-Attribut definiert oder mithilfe von #import aus einer Typbibliothek mit dem embedded_idl-Attribut #import importiert werden.

Beachten Sie, dass die Zeilen der ATL-Headerdateien im folgenden Beispiel für die #include Verwendung von COM-Ereignissen erforderlich sind. Um diesen Fehler zu beheben, erstellen IEvents Sie (die Ereignisschnittstelle) eine COM-Schnittstelle, indem Sie eines der folgenden Attribute auf die Schnittstellendefinition anwenden: Objekt, dual oder dispinterface.

Wenn eine Schnittstelle aus einer von MIDL generierten Headerdatei stammt, erkennt der Compiler sie nicht als COM-Schnittstelle.

Im folgenden Beispiel wird C3706 generiert:

// C3706.cpp
// compile with: /c
// C3706 expected
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>
#include <atlctl.h>

[module(dll, name="idid", uuid="12341234-1234-1234-1234-123412341234")];

// Uncomment the following line to resolve.
// [object, uuid="12341234-1234-1234-1234-123412341237"]
__interface IEvents : IUnknown {
   HRESULT event1(/*[in]*/ int i);   // uncomment [in]
};

[dual, uuid="12341234-1234-1234-1234-123412341235"]
__interface IBase {
   HRESULT fireEvents();
};

[coclass, event_source(com), uuid="12341234-1234-1234-1234-123412341236"]
class CEventSrc : public IBase {
   public:
   __event __interface IEvents;

   HRESULT fireEvents() {
      HRESULT hr = IEvents_event1(123);
      return hr;
   }
};