2

コンストラクターで HWND ウィンドウ ハンドルを受け取る C++ レガシー クラス用の Boost.Python ラッパー (Py++ を使用) を作成しました。ただし、モジュールを使用しようとしたときにモジュールを 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++ 出力:

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") ) );

        }
    }
}

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)
>>>

この問題を修正して、Python で (win32gui から) ウィンドウのハンドルを C++ クラスに渡し、それとやり取りできるようにするにはどうすればよいですか?

環境: Visual Studio 2008、Boost 1.44、gcc-xml 0.9.0、py++ 1.0.0、pygccxml 1.1.0

4

1 に答える 1

0

boost python によって生成されたラップされた型が、別のツールで使用されるラップ手順と互換性があるとは限りません。この場合、win32 gui は SWIG を使用して構築され、正しいコードを生成するために (ラップされるタイプに応じて) C、C++、および Python コードの追加レイヤーを導入できます。

pywin32 mercurial リポジトリGetDesktopWindowで、 (および他の多くの関数)の SWIG インターフェース ファイルを確認できます。

于 2012-04-30T20:45:18.313 に答える