firebreath — Доступ к членам объекта C ++ в javascript без регистрации его членов.

РЕДАКТИРОВАТЬ:
/ *
Можно ли получить доступ к объекту класса не JSAPI в javascript через унаследованный конверт JSAPI.
Некоторые вещи, как показано ниже.
* /

class DataPersonal
{
public:
std::string GetName()
{
return "ABC";
}

};
class Envelop:FB::JSAPIAuto
{
public:
Envelop(){
registerMethod("GetData", make_method(this, &Envelop::GetData));
}
DataPersonal* GetData()
{
return new DataPersonal();
}

};

/*

В JavaScript

alert(plugin0.GetData().GetName());

Где plugin0 — Конверт
* /

Причина этого в том, что исходный код DataPersonal недоступен, он находится в скомпилированной форме, поэтому я не могу изменить класс DataPersonal.
Любой обходной путь для этого?

1

Решение

Я немного запутался. Что именно заставляет вас думать, что был бы способ получить доступ к членам объекта C ++ в Javascript без использования registerMethod или registerProperty? Существует причина, по которой существует класс JSAPIAuto, и причина в том, чтобы обеспечить интерфейс между javascript и C ++.

Единственный способ сделать доступным «_name» — это использовать registerProperty и метод получения / установки, который получает / устанавливает _name или registerMethod для GetName и registerMethod для SetName.

Возможно, я не совсем понимаю ваш вопрос или что вы пытаетесь сделать?

если вы зарегистрируете свойство с помощью метода получения и метода установки, то из javascript вы будете использовать его как обычный член:

// In C++ in the constructor
registerProperty("_name", make_property(this, &MyClassAPI::get_name, &MyClassAPI::set_name));

// In the javascript
myPlugin._name = "Bobb";
alert(myPlugin._name);

Это помогает вообще? Javascript ничего не знает о типах C ++ или C ++, поэтому вы не можете напрямую предоставлять ему класс C ++; это был бы не что иное, как непрозрачный указатель на javascript. За кулисами создается NPObject *, который оборачивает тип JSAPI и при необходимости преобразует значения и тому подобное в и из, это одна из причин, по которой FireBreath так удобно использовать.


РЕДАКТИРОВАТЬ: Ваш пересмотренный вопрос имеет больше смысла. По сути, можно сделать то, что вы описываете, используя объект JSAPI make_method с указателем на внутренний объект и указателем функции на метод, который вы хотите вызвать, например, так:

    class DataPersonal
{
public:
std::string GetName()
{
return "ABC";
}

};
class Envelop : FB::JSAPIAuto
{
public:
Envelop() {
registerMethod("GetName", make_method(&m_data, &DataPersonal::GetName));
}

private:
DataPersonal m_data;
};

Как вы можете видеть в примере, вы не можете просто вернуть указатель на класс и ожидать, что он будет работать — это не так. Если бы это произошло, нам бы не понадобился сложный класс, такой как JSAPI, чтобы обернуть его, чтобы он работал. Однако, насколько я знаю, нет причины, по которой make_method не может переносить метод из другого класса, если все параметры и возвращаемые типы совместимы с JSAPI. Хитрость заключается в том, чтобы убедиться, что жизненный цикл указателя вы используете (в этом случае &m_data) привязан к вашему классу JSAPI; в противном случае у вас может быть случай, когда объект был освобожден, но javascript все еще хочет его использовать.

Конечно, вам нужно зарегистрировать свойство или метод для каждого свойства или метода во внутреннем классе, который вы хотите предоставить. Если у любого из них есть параметры или возвращаемые типы, которые не совместимы с JSAPI (что, вероятно, учитывает все обстоятельства), вы можете просто добавить функцию-оболочку для объекта JSAPI, которая вызывает функцию для внутреннего объекта. Короче говоря, вы используете класс JSAPI в качестве оболочки для методов и объектов внутреннего класса.

JSAPI делает столько автоматического преобразования с произвольными функциями, сколько возможно; Нельзя просто передать случайный тип класса в javascript и понять его.

3

Другие решения

Я не думаю, что вы можете сделать это, каждый ваш объект C ++, к которому вы хотите получить доступ из Javascript, должен быть унаследован от FB :: JSAPIAuto, вы не можете просто вернуть указатель C ++, который не будет работать в Javascript.

Вы можете использовать следующий способ для доступа к другим объектам C ++ и их методам или свойствам.

class MyJSAPIClass : public FB::JSAPIAuto
{
public:
MyJSAPIClass(const MyPluginPtr& plugin, const FB::BrowserHostPtr& host)
{
// Register your c++ object as a read only property
registerProperty("myCppObject",
make_property(this, &MyJSAPIClass ::GetMyCppMethod));
}

FB::JSAPIPtr GetMyCppMethod() { return m_cpp_object; }
private:
MyCPPClassPtr m_cpp_object;
}

FB_FORWARD_PTR(MyCPPClass)
class MyCPPClass : public FB::JSAPIAuto
{
public:
MyCPPClass()
{
_name="My name is...";

// Register your get name as a read only property
registerProperty("name",
make_property(this, &MyCPPClass::GetName));
}
std::String GetName()
{
return _name;
}
private:
std::string _name;
}

Затем в своем коде Javascript вы можете получить доступ к своему имени из формы MyCPPClass, как показано ниже:

plugin.myCppObject.name
3

По вопросам рекламы [email protected]