VS7. Подключение к COM-events через __hook
От: Andy77 Ниоткуда  
Дата: 09.07.02 16:17
Оценка:
: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 объявлен как простой интерфейс, что же делать?
Re: VS7. Подключение к COM-events через __hook
От: Esperar  
Дата: 21.09.04 13:45
Оценка:
Здравствуйте, 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 объявлен как простой интерфейс, что же делать?

ответьте если кто знает, тоже очень интересно
Re: VS7. Подключение к COM-events через __hook
От: vitalyk  
Дата: 02.08.05 13:21
Оценка:
A>что же я делаю неправильно?

Попробуй в строчку импорта добавить квалификатор embedded_idl, т.е. где-то так:
#import "Smth.tlb" no_namespace raw_interfaces_only raw_dispinterfaces raw_native_types embedded_idl

У меня была такая же ошибка, помогло внимательное прочтение MSDN'a
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.