Compartir a través de


Error del compilador C3706

'función': debe ser una interfaz COM para desencadenar eventos COM

La interfaz de eventos que se usa para desencadenar eventos COM debe ser una interfaz COM. En esta situación, la interfaz debe definirse con un atributo de Visual C++ o importarse mediante #import desde una biblioteca de tipos con el atributo embedded_idl de #import.

Tenga en cuenta que las líneas #include de los archivos de encabezado ATL que se muestran en el ejemplo siguiente son necesarias para usar eventos COM. Para corregir este error, convierta IEvents (la interfaz de eventos) en una interfaz COM aplicando uno de los siguientes atributos a la definición de interfaz: object, dual o dispinterface.

Si una interfaz procede de un archivo de encabezado generado por MIDL, el compilador no lo reconoce como una interfaz COM.

El ejemplo siguiente genera el error C3706:

// 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;
   }
};