Обрабатывать сгенерированные с # события в firebreath PluginAPI.cpp с помощью COM Callable Wrapper

Помогает ли в этом вопросе JSCallBack в Firebreath? Потому что то, что я только что видел, обрабатывает только события, произошедшие в проекте firebreath(native C++). Я здесь? Я использовал концепцию интерфейса IConnectionPoint для установления соединения с исходящим интерфейсом, содержащим сигнатуры событий. Мой код очень похож на этот пост.

Также я нашел эту информацию относительно Соединения COM с клиентом. Теперь задайте вопрос: должен ли мой класс PluginAPI реализовать этот исходящий интерфейс в файле PluginAPI.h? Как это,

class PluginAPI : public FB::JSAPIAuto, public ManagedDLL::ICalculatorEvents
{
//register methods
}

Если так, то это поднимает 2 ошибки

  1. Рассказ не может создать экземпляр абстрактного класса. Указывает мне на эти строки make_shared.hpp

    шаблон<класс T, класс A1, класс A2>boost::shared_ptr make_shared( A1 && a1, A2 && a2) { boost::shared_ptr pt( static_cast( 0), BOOST_SP_MSD( T));

    boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
    
    void * pv = pd->address();
    
    ::new( pv ) T(         ////HERE
        boost::detail::sp_forward<A1>( a1 ), 
        boost::detail::sp_forward<A2>( a2 )
        );
    

и 2. для alignment_of.hpp

template <typename T>
struct alignment_of_hack
{
    char c;
    T t;        ///HERE
    alignment_of_hack();
};

Застрял здесь на последние 2 дня. Также любой обходной путь для этого.

1 ответ

Решение

Не знаю ничего о взаимодействии C#, которое вы пытаетесь сделать, но я могу вам сказать, что проблема, с которой вы сталкиваетесь с "не может создать экземпляр абстрактного класса", заключается в том, что вы расширяете ManagedDLL::ICalculatorEvents, и это, предположительно, абстрактный базовый класс, Это означает, что вам нужно реализовать чисто виртуальные функции, которые находятся в этом классе.

Кроме этого я понятия не имею. Одной из идей может быть разделение кода FireBreath и кода вызова COM и создание класса, который вы будете использовать в качестве моста. Вместо того, чтобы вносить изменения в свой объект PluginCore, который уже тесно связан с огненным дыханием, создайте новый объект, который может стать мостом, и сделайте с этим странные вещи.

Просто мысль; Я думаю, что это упростит вещи, хотя, потому что тогда вы могли бы задавать вопросы, которые были бы только о стороне COM или только о FireBreath. Когда вы смешиваете их, вы попадаете в ситуации, когда люди не отвечают, потому что они знают только одно или другое и не знают, как та половина, которую они не понимают, может влиять на вещи =]

Другие вопросы по тегам