Firebreath C++, некоторое понимание указателя

Я задал здесь один вопрос Получить координаты экрана мыши при нажатии и получил хороший ответ (подтверждено одно), спасибо Gaurav Raj за это. И в этом образце:

bool MirrarOrnaments::onMouseDown(FB::MouseDownEvent *evt, FB::PluginWindow *) 
{
  if(evt->m_Btn == FB::MouseButtonEvent::MouseButton_Left) 
  {
    /** 
     * apiPtr is the pointer to FB::JSAPIPtr 
     * mousePositionCallback is the JSAPI function which takes variant list of mouse 
     * co-ordinates as argument 
     */ 
    apiPtr->invoke("mousePositionCallback", FB::variant_list_of(evt->m_x)(evt->m_y)); 
  }
}

Как я понимаю, последняя строка должна запускать функцию mousePositionCallback в моем JavaScript с аргументом FB::variant_list; Но я не могу понять назначение указателя apiPtr, где его взять и как этот указатель на FB::JSAPIPtr должен выглядеть в моем коде.


person Max Yari    schedule 21.05.2013    source источник
comment
исправьте первую строку, чтобы блок кода выглядел нормально... (добавьте один пробел между абзацем и кодом...   -  person Dory Zidon    schedule 21.05.2013
comment
круто, я только что отредактировал свой ответ .. посмотри, что я предлагаю.   -  person Dory Zidon    schedule 21.05.2013


Ответы (1)


Тип FB::JSAPIPtr в FireBreath — это просто удобный псевдоним для boost::shared_ptr (общий автоматический указатель, поэтому вам не нужно вызывать удаление объекта, и вам не нужно беспокоиться о его исчезновении)...

Попробуйте добавить вызов getRootJSAPI(), это должно вернуть вам apiPtr.

bool MirrarOrnaments::onMouseDown(FB::MouseDownEvent *evt, FB::PluginWindow *) 
{
  if(evt->m_Btn == FB::MouseButtonEvent::MouseButton_Left) 
  {
    /** 
     * apiPtr is the pointer to FB::JSAPIPtr 
     * mousePositionCallback is the JSAPI function which takes variant list of mouse 
     * co-ordinates as argument 
     */ 
    // if you want to access it from the API Part
    // FB::JSAPIPtr apiPtr(boost::make_shared<FBYourPluginAPI>(m_plugin));
    //add the next line:
    FB::JSAPIPtr apiPtr = m_plugin.lock()->getRootJSAPI();
    apiPtr->Invoke("mousePositionCallback", FB::variant_list_of(evt->m_x)(evt->m_y)); 
  }
}
person Dory Zidon    schedule 21.05.2013
comment
Протестированный код в последнем примере дает мне ошибку, что invoke не является членом FB::JSAPI - person Max Yari; 21.05.2013
comment
это Invoke с заглавными буквами.. исправлен образец. - person Dory Zidon; 21.05.2013
comment
Я предлагаю вам ознакомиться с примерами и документацией Firebrethe, это объясняет большую часть этого.. firebreath.org - person Dory Zidon; 21.05.2013
comment
хорошо, при использовании getRootJSAPI() он просто говорит, что он не определен. при использовании FB::JSAPIPtr apiPtr(boost::make_shared<TestPluginAPI>(m_plugin)); говорит TestPluginAPI::TestPluginAPI(TestPluginAPI &): невозможно преобразовать параметр 1 из TestPluginWeakPtr в TestPluginAPI & - person Max Yari; 21.05.2013
comment
хорошо, тогда попробуйте одно из следующих: либо попробуйте использовать m_plugin-›Invoke, либо попробуйте apiPtr(boost::make_shared‹TestPluginAPI(*m_plugin)) или apiPtr(boost::make_share‹TestPluginAPI›(m_plugin-›lock() ) - person Dory Zidon; 21.05.2013
comment
к сожалению, ничего из этого не работает =( На ...(*m_plugin) это "illegal indirection" На ...(*m_plugin)->lock() это куча ошибок: 'boost::shared_ptr<X> boost::make_shared(2-9 arg's here)' : expects 2-9 arguments - 1 provided. И если я просто заменю apiPtr на m_plugin, это type "boost::weak_ptr<T>" does not have an overloaded member "operator ->" - person Max Yari; 21.05.2013
comment
давайте продолжим обсуждение в чате - person Dory Zidon; 21.05.2013