У меня есть класс C # .NET, имеющий подпись события, которая предоставляется COM с использованием исходящего интерфейса, как это:
[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)
{....}
Мой помощник Event в заявлении Firebreath
FB_JSAPI_EVENT(CSharpEvent, 2, (VARIANT,struct _EventArgs *));
Я тоже видел Эта ссылка. Так что boost :: vairant поддерживается правильно? Тогда как разыграть VARIANT для boost :: option?
Ожидаются ли какие-либо изменения в приведенном выше заявлении?
Как обработать вышеупомянутое событие в c # с помощью VARIANT или struct? Любые примеры будут полезны ..
Нет, Boost :: Вариант не поддерживается, FB :: Вариант поддерживается — это совсем не одно и то же. FB :: Вариант фактически использует boost :: any для внутреннего использования.
То, что вы пытаетесь сделать, это смешать COM и FireBreath, и это не даст хорошего результата. Вместо этого создайте класс, который взаимодействует с вашим COM-компонентом, и используйте его из вашего объекта JSAPI. Обработайте событие в вашем объекте и заставьте его вызвать функтор (посмотрите на boost :: bind и boost :: function) или, возможно, используйте сигналы и сокеты от boost. Есть много способов справиться с этим, но главное в том, что вам нужно сначала получить свой объект C ++, который знает, как общаться с COM, а затем использовать этот объект из FireBreath будет легко. Непосредственное использование VARIANT или произвольного типа структуры с событиями firebreath никогда не сработает.
Других решений пока нет …