Cython包装c ++ WHND转换指针

时间:2015-12-07 23:10:34

标签: c++ cython

很抱歉发布了那么多代码,但这是我能想到的最小例子来展示问题(好吧,有些行可以省略但是这样就可以准备好测试了)

我尝试用cyton包装一个简短的c ++函数(显示一个Windows MessageBox)并向该函数传递一个指针(int)(由wxPython生成)

转换指针似乎没有正常工作,至少指针到达c ++级别是不同的。

我在哪里犯错?

马丁

cpp_test-cpp:

#include "cpp_test.h"

Test::Test() { 
}
Test::~Test() {
}
int Test::Message(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, int uType){
       printf( "Test::Message Handle as seen from c++: %d\n", hWnd);
       return MessageBoxW( hWnd,  lpText,  lpCaption, uType); 
} 

cpp_test.h

#pragma once

#include <Windows.h>
#include <stdio.h>


class Test { 
public: 
Test();
~Test(); 
int Message(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, int uType);
};

test.pxd

cdef extern from "Windows.h":
    ctypedef Py_UNICODE WCHAR
    ctypedef const WCHAR* LPCWSTR
    ctypedef void* HWND

cdef extern from "cpp_test.h": 
    cdef cppclass Test:
        Test()
        int Message(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, int uType);

test.pyx

cimport test

cdef class pyTest: 
    cdef Test* thisptr

    def __cinit__(self):
        print "__cinit__"
        self.thisptr = new Test()

    def __dealloc__(self):
        print "__dealloc__"
        del self.thisptr

    cpdef PyMessage(self, HandleToWindow):
        print "pyTest::PyMessage Handle before casting :"+ str(HandleToWindow)
        if HandleToWindow == "NULL":
            title = u"Windows Interop Demo - Python"
            return self.thisptr.Message(NULL, u"Hello Cython \u263a", title, 0)
        else:
            hwnd =<HWND> HandleToWindow
            print "pyTest::PyMessage after recasting to object casting: " +str(<object>hwnd)
            title = u"Windows Interop Demo - Python"
            return self.thisptr.Message(hwnd, u"Hello Cython \u263a", title, 0)

useTest.py

from test import pyTest

k = pyTest()

print k.PyMessage(12345)

1 个答案:

答案 0 :(得分:0)

您的问题是,强制转换hwnd =<HWND> HandleToWindow获取指向您PyObject的{​​{1}}指针,而不是根据HandleToWindow的内容设置空指针。

一种解决方案是创建一个Cython类

HandleToWindow

然后使用它(在函数cdef class PyHandleToWindow: HWDB ptr def __cinit__(self): self.ptr = NULL 中,以及你需要在Python中传递这些句柄的任何其他地方)

PyMessage

您也可以使用此方法直接传递NULL指针,而不是使用字符串。