使用Boost.Python包装和传递HWND 我为一个C++的遗留类创建了一个Boosi.python包装器(使用Py++),它在构造函数中采用了一个HWND窗口句柄。但是,当我尝试使用模块时,将其导出到python后,会出现类型不匹配错误 这是我正在包装的C++类: // File Foo.hpp // #include "Windows.h" class Foo { public: Foo( const HWND window ){} virtual ~Foo(){} virtual int Bar( int num ) { return num; } };
Py++输出:使用Boost.Python包装和传递HWND 我为一个C++的遗留类创建了一个Boosi.python包装器(使用Py++),它在构造函数中采用了一个HWND窗口句柄。但是,当我尝试使用模块时,将其导出到python后,会出现类型不匹配错误 这是我正在包装的C++类: // File Foo.hpp // #include "Windows.h" class Foo { public: Foo( const HWND window ){} virtual ~Foo(){} virtual int Bar( int num ) { return num; } };,python,boost,hwnd,win32gui,py++,Python,Boost,Hwnd,Win32gui,Py++,Py++输出: INFO Parsing source file "foo.hpp" ... INFO gccxml cmd: ""c:\Program Files (x86)\gccxml 0.9\bin\gccxml.exe" -I"." "foo.hpp" -fxml="d:\temp\tmpdng3ts.xml"" INFO GCCXML version - 0.9( 1.127 ) INFO: file "generated_wrapper.cpp" - updated( 0.00
INFO Parsing source file "foo.hpp" ...
INFO gccxml cmd: ""c:\Program Files (x86)\gccxml 0.9\bin\gccxml.exe" -I"." "foo.hpp" -fxml="d:\temp\tmpdng3ts.xml""
INFO GCCXML version - 0.9( 1.127 )
INFO: file "generated_wrapper.cpp" - updated( 0.001607 seconds )
生成的包装器:
#include "boost/python.hpp"
#include "foo.hpp"
namespace bp = boost::python;
struct Foo_wrapper : Foo, bp::wrapper< Foo > {
Foo_wrapper(::HWND const window )
: Foo( window )
, bp::wrapper< Foo >(){
// constructor
}
virtual int Bar( int num ) {
if( bp::override func_Bar = this->get_override( "Bar" ) )
return func_Bar( num );
else{
return this->Foo::Bar( num );
}
}
int default_Bar( int num ) {
return Foo::Bar( num );
}
};
BOOST_PYTHON_MODULE(MyWrapper){
{ //::Foo
typedef bp::class_< Foo_wrapper > Foo_exposer_t;
Foo_exposer_t Foo_exposer = Foo_exposer_t( "Foo", bp::init< HWND__ *>(( bp::arg("window") )) );
bp::scope Foo_scope( Foo_exposer );
bp::implicitly_convertible< const HWND, Foo >();
{ //::Foo::Bar
typedef int ( ::Foo::*Bar_function_type )( int ) ;
typedef int ( Foo_wrapper::*default_Bar_function_type )( int ) ;
Foo_exposer.def(
"Bar"
, Bar_function_type(&::Foo::Bar)
, default_Bar_function_type(&Foo_wrapper::default_Bar)
, ( bp::arg("num") ) );
}
}
}
#包括“boost/python.hpp”
#包括“foo.hpp”
名称空间bp=boost::python;
结构Foo_包装器:Foo,bp::wrapper{
Foo_包装器(::HWND const窗口)
:Foo(窗口)
,bp::wrapper(){
//建造师
}
虚拟整数条(整数){
如果(bp::override func\u Bar=this->get\u override(“Bar”))
返回函数条(num);
否则{
返回此->Foo::Bar(num);
}
}
int默认值_栏(int num){
返回Foo::Bar(num);
}
};
BOOST_PYTHON_模块(MyWrapper){
{/::Foo
typedef bp::class_uuFoo_暴露器;
Foo_exposer\u t Foo_exposer=Foo_exposer\u t(“Foo”,bp::init((bp::arg(“窗口”)));
范围Foo_范围(Foo_exposer);
bp::隐式可转换();
{/::Foo::Bar
typedef int(::Foo::*条函数类型)(int);
typedef int(Foo_包装::*默认的函数类型)(int);
Foo_exposer.def(
“酒吧”
,Bar_函数类型(&::Foo::Bar)
,默认\u栏\函数\类型(&Foo\u包装器::默认\u栏)
,(bp::arg(“num”);
}
}
}
在python中,我得到了不匹配错误:
>>> import MyWrapper
>>> import win32gui
>>> hwnd = win32gui.GetDesktopWindow()
>>> foo = MyWrapper.Foo(hwnd)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
Foo.__init__(Foo, int)
did not match C++ signature:
__init__(struct _object *, struct HWND__ * window)
>>>
导入MyWrapper
>>>导入win32gui
>>>hwnd=win32gui.GetDesktopWindow()
>>>foo=MyWrapper.foo(hwnd)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ArgumentError:中的Python参数类型
Foo.\uuuu init\uuuo(Foo,int)
与C++签名不匹配:
__初始化(结构对象*,结构窗口)
>>>
<> Python如何将Windows的句柄(从Wi32 GUI)传递到C++类,并与之交互?
环境:
Visual Studio 2008、Boost 1.44、gcc xml 0.9.0、py++1.0.0、pygccxml 1.1.0您不能假设Boost python生成的包装类型将与其他工具使用的包装过程兼容。在这种情况下,Win32 GUI是使用SWIG构建的,它可以引入C、C++和Python代码的附加层(取决于要封装的类型)来生成正确的代码。
您可以在pywin32中看到
GetDesktopWindow
(以及许多其他函数)的SWIG接口文件。您不能假设boostpython生成的包装类型与其他工具使用的包装过程兼容。在这种情况下,Win32 GUI是使用SWIG构建的,它可以引入C、C++和Python代码的附加层(取决于要封装的类型)来生成正确的代码。
您可以在pywin32中看到
GetDesktopWindow
(以及许多其他函数)的SWIG接口文件,谢谢,但是如何将GetDesktopWindow
的int输出转换为C++的HWND(void*)?谢谢,但是如何将GetDesktopWindow
的int输出转换为C++的HWND(void*)?