Partilhar via


Erro do compilador C3706

'função' : deve ser uma interface COM para gerar eventos COM

Observações

A interface de evento que você usa para disparar eventos COM deve ser uma interface COM. Nessa situação, a interface deve ser definida usando um atributo do Visual C++ ou importada usando #import de uma biblioteca de tipos com o atributo embedded_idl do #import.

Observe que as #include linhas dos arquivos de cabeçalho ATL mostradas no exemplo abaixo são necessárias para usar eventos COM. Para corrigir esse erro, torne IEvents (a interface de eventos) uma interface COM aplicando um dos seguintes atributos à definição de interface: object, dual ou dispinterface.

Se uma interface for de um arquivo de cabeçalho gerado pelo MIDL, o compilador não a reconhecerá como uma interface COM.

Example

O exemplo a seguir gera 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;
   }
};