使用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; } };

使用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

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.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*)?