Hello,

I've created a Boost.Python wrapper (using Py++) for a C++ legacy class
that takes a HWND window handle in its constructor. However, after
exporting the module to python when I try to use it, I get a type mismatch
error.

--------------------------
Here is the C++ class I'm wrapping:

    // File Foo.hpp
    //
    #include "Windows.h"
    class Foo
    {
    public:
        Foo( const HWND window ){}

        virtual ~Foo(){}

        virtual int Bar( int num ) { return num; }
    };

--------------------------
The Py++ output:

    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 )

--------------------------
The generated wrapper:

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

            }
        }
    }

--------------------------
In python I get the not-match error:

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

How can I correct this problem to be able to pass a window's handle (from
win32gui) in Python to C++ class, and interact with it?

Environment:
Visual Studio 2008, Boost 1.44, gcc-xml 0.9.0, py++ 1.0.0, pygccxml 1.1.0
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to