如何使用boost和Firebreath从python中正确触发浏览器事件 首先,我必须说,作为一个Python程序员,我可能从错误的角度看待这个问题,自从我在大学写了我的最后一个C++代码以来,很多年过去了。
我遇到了一点问题,试图使用firebreath创建一个混合python/c++插件。到目前为止,我已经成功地使用boost/python.h集成了所有部分,但是当我试图从python内部触发事件时出现了一个问题。我遇到了一个问题,就是必须用一个C++函数绑定一个Python函数(使用BooStpyPythOnMax模块)。首先,我尝试用我的JSAPI派生类FBestTyPyPythOnAPI绑定Python,这个方法的问题似乎是缺少对浏览器实例化的JSAPI对象的引用,它给了我在执行时Python函数和C++等价物之间的各种签名错配问题。p> 我唯一想到要解决这个问题(我同意,这是一个丑陋肮脏的解决方案),就是使用一个全局指针,我用set_pluginPointer手动初始化它。到目前为止,这确实很有效,但我知道这不是正确的方法。我读到我不应该将“原始”指针与JSAPI对象一起使用,但我不确定如何将其替换为这个特定实现的共享_ptr。另一个问题是全局变量,它是所有实例的共享访问,例如,导致在最后打开的选项卡/窗口上触发所有事件。解决后者的一种方法是创建某种数组,其中索引是当前窗口/线程id,我应该能够从JSAPI对象和python/c++函数访问它 当然,对于如何改进/修复这一特定的解决方法,或者更好地,如何在不进行黑客攻击的情况下正确地沟通boost::python和firebreath,我持开放态度,并将非常感谢任何建议 下面是插件代码的相关部分如何使用boost和Firebreath从python中正确触发浏览器事件 首先,我必须说,作为一个Python程序员,我可能从错误的角度看待这个问题,自从我在大学写了我的最后一个C++代码以来,很多年过去了。,c++,python,boost,boost-python,firebreath,C++,Python,Boost,Boost Python,Firebreath,我遇到了一点问题,试图使用firebreath创建一个混合python/c++插件。到目前为止,我已经成功地使用boost/python.h集成了所有部分,但是当我试图从python内部触发事件时出现了一个问题。我遇到了一个问题,就是必须用一个C++函数绑定一个Python函数(使用BooStpyPythOnMax模块)。首先,我尝试用我的JSAPI派生类FBestTyPyPythOnAPI绑定Python,这个方法的问题似乎是缺少对浏览器实例化的JSAPI对象的引用,它给了我在执行时Pytho
// Global pointer to plugin instance
fbtestconpythonAPI *fbtestPtr;
void fbtestconpythonAPI::set_pluginPointer(const std::string& val){
m_testString = val;
fbtestPtr = this; //Global pointer initialization
}
void echo(std::string x){
// Firing the echo event on the plugin instance using the global raw pointer
fbtestPtr->fire_echo(x, 1);
}
BOOST_PYTHON_MODULE(Pointless) {
def("echo", echo);
}
FB::variant fbtestconpythonAPI::echo(const FB::variant& msg){
int result_value;
Py_Initialize();
try {
initPointless(); // initialize Pointless
PyRun_SimpleString("import Pointless");
PyRun_SimpleString("Pointless.echo('hello world')");
object module(handle<>(borrowed(PyImport_AddModule("__main__"))));
object dictionary = module.attr("__dict__");
} catch (error_already_set) {
PyErr_Print();
}
Py_Finalize();
return 0;
}
//指向插件实例的全局指针
fbtestconpythonAPI*fbtestPtr;
void fbtestconpythonAPI::set_pluginPointer(const std::string&val){
m_testString=val;
fbtestPtr=this;//全局指针初始化
}
无效回显(标准::字符串x){
//使用全局原始指针在插件实例上触发echo事件
fbtestPtr->fire_echo(x,1);
}
BOOST_PYTHON_模块(无意义){
def(“echo”,echo);
}
FB::variant fbtestconpythonAPI::echo(const FB::variant&msg){
int结果_值;
Py_初始化();
试一试{
initPointless();//初始化无意义
PyRun_SimpleString(“导入无意义”);
PyRun_SimpleString(“Pointless.echo('hello world')”);
对象模块(句柄(借用的(PyImport\u AddModule(“\uuu main\uuuu”)));
对象字典=module.attr(“\uuuu dict\uuuuuu”);
}捕获(已设置错误){
PyErr_Print();
}
Py_Finalize();
返回0;
}
通过快速查看,您可以如下所示设置导出类:
class_<YourAPI, boost::noncopyable>("YourAPI", no_init)
.def("function", &YourAPI::function);
类(“YourAPI”,无初始化)
.def(“函数”和YourAPI::函数);
然后你可以将你的C++实例传递给Python,允许你调用它上的函数,而函数又可以触发事件。p> 我还没有使用Boost.Python,但您似乎应该研究如何将Python对象绑定到FireBreath插件实例,而不是试图让变通方法(自由函数+全局函数)发挥作用。我建议您就最初的问题提问。谢谢您的评论。也许我不是很清楚,请原谅我,因为英语不是我的第一语言,我的意思是,任何关于如何做到这一点的建议(connect boost:python with firebreath)都将受到高度赞赏。我只是想和大家分享我提出的解决方案,从回答中排除这个问题。我明白了,我只是误解了你。非常感谢Georg。我马上就开始调查