:crash:
что же я делаю неправильно?
имеем событийный интерфейс (оставил только существенное)...
dispinterface _IPlateDataEvents
{
properties:
methods:
[id(1), helpstring("Fired when plate size or labeling changed")]
HRESULT onChange();
};
теперь пишем класс для подключения к событиям
#pragma once
#import "GenericPlateData.tlb" no_namespace
[event_receiver(com)]
class PlateDataEventsReceiver
{
public:
PlateDataEventsReceiver() {}
virtual ~PlateDataEventsReceiver() {}
void hook(IUnknown* pSource)
{
__hook(&_IPlateDataEvents::onChange, pSource, &PlateDataEventsReceiver::onChange);
}
HRESULT onChange() { return S_OK; }
};
и тут компилятор нам выдаёт
error C3731: incompatible event 'HRESULT _IPlateDataEvents::onChange(void)' and handler 'HRESULT PlateDataEventsReceiver::onChange(void)'; event source and event handler must have the same event type
The event type of '_IPlateDataEvents' is 'native'.
The event type of 'PlateDataEventsReceiver' is 'COM'.
действительно, в .tli и .tlh _IPlateDataEvents объявлен как простой интерфейс, что же делать?
Здравствуйте, Andy77, Вы писали:
A>
A>что же я делаю неправильно?
A>имеем событийный интерфейс (оставил только существенное)...
A>A> dispinterface _IPlateDataEvents
A> {
A> properties:
A> methods:
A> [id(1), helpstring("Fired when plate size or labeling changed")]
A> HRESULT onChange();
A> };
A>
A>теперь пишем класс для подключения к событиям
A>A>#pragma once
A>#import "GenericPlateData.tlb" no_namespace
A>[event_receiver(com)]
A>class PlateDataEventsReceiver
A>{
A>public:
A> PlateDataEventsReceiver() {}
A> virtual ~PlateDataEventsReceiver() {}
A> void hook(IUnknown* pSource)
A> {
A> __hook(&_IPlateDataEvents::onChange, pSource, &PlateDataEventsReceiver::onChange);
A> }
A> HRESULT onChange() { return S_OK; }
A>};
A>
A>и тут компилятор нам выдаёт
A>error C3731: incompatible event 'HRESULT _IPlateDataEvents::onChange(void)' and handler 'HRESULT PlateDataEventsReceiver::onChange(void)'; event source and event handler must have the same event type
A> The event type of '_IPlateDataEvents' is 'native'.
A> The event type of 'PlateDataEventsReceiver' is 'COM'.
A>действительно, в .tli и .tlh _IPlateDataEvents объявлен как простой интерфейс, что же делать?
ответьте если кто знает, тоже очень интересно
A>что же я делаю неправильно?
Попробуй в строчку импорта добавить квалификатор embedded_idl, т.е. где-то так:
#import "Smth.tlb" no_namespace raw_interfaces_only raw_dispinterfaces raw_native_types
embedded_idl
У меня была такая же ошибка, помогло внимательное прочтение MSDN'a