Erro do compilador C3706
'function': precisa ser uma interface COM para disparar eventos COM
A interface do evento que você usa para disparar eventos COM precisa 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 de #import.
Observe que as linhas #include
dos arquivos de cabeçalho da ATL mostrados no exemplo abaixo são necessárias para o uso de eventos COM. Para corrigir esse erro, torne IEvents
(a interface de evento) 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 por MIDL, o compilador não a reconhecerá como uma interface COM.
O seguinte exemplo gera o erro 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;
}
};