2013-07-04 2 views
1

У меня есть C# .NET класс, имеющий подпись событие, которое подвергается COM с помощью исходящего интерфейса, как это ::Пользовательские обработки событий в COM C++

[ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IHehServerEvents 
    { 
     string EmptyEvent(object sender, CustomEventArgs args); 
    } 

В PluginAPI.h >> У меня есть

class PluginAPI: public IHehServerEvents,public FB::JSAPIAuto//implemented the COM outgoing interface 
{ 

// объявлен метод EmptyEvent основанный на TLH файл

HRESULT __stdcall EmptyEvent(VARIANT sender,IUnknown * args, BSTR * pRetVal); 
     FB_JSAPI_EVENT(CSharpEvent, 2, (FB::variant,IUnknown *)); 

    } 
    HRESULT ClassCpluss::EmptyEvent(BSTR message, BSTR * pRetVal) 
    {....} 

Мои события ч elper в заявлении Firebreath является

FB_JSAPI_EVENT(CSharpEvent, 2, (VARIANT,struct _EventArgs *)); 

Я также видел THIS link. SO boost :: vairant поддерживается правильно? Тогда как заставить VARIANT увеличить :: вариант? Любые изменения, ожидаемые в приведенном выше заявлении? Как обрабатывать вышеуказанное событие в C# с помощью VARIANT или struct? Любые примеры были бы полезны.

ответ

1

Нет, boost :: variant не поддерживается, поддерживается FB :: variant - это не то же самое вещь вообще. FB :: variant фактически использует boost :: any внутри.

Что вы пытаетесь сделать, это смешивать COM и FireBreath, и у него не будет хорошего результата. Вместо этого создайте класс, который говорит с вашим материалом COM, и используйте его из вашего объекта JSAPI. Обработайте событие в своем объекте и вызовите функтор (посмотрите на boost :: bind и boost :: function) или, возможно, используйте сигналы и сокеты от boost. Есть много способов справиться с этим, но ключ здесь заключается в том, что вам нужно сначала получить свой объект C++, который знает, как разговаривать с COM, а затем использовать этот объект из FireBreath будет легко. Непосредственно использование VARIANT или произвольного типа структуры с событиями firebreath никогда не будет работать.

+0

Несомненно знал о boost :: function и boost :: bind.But вы можете дать нам ссылку/предоставить пример (обработки COM-событий на C++) и о том, что вы говорите об этом заявлении «попросите его позвонить функтор (посмотрите на boost :: bind и boost :: function) « –

+0

Я не выполнял обработку COM-событий в C++. Чтобы увидеть пример использования функтора, посмотрите класс SimpleStreamsHelper в кодовой базе FireBreath - он использует обратный вызов boost :: function. Чтобы увидеть его, посмотрите на FBTestPlugin, где он использует SimpleStreamsHelper. – taxilian

Смежные вопросы