我尝试用Cython Package 一个简短的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条答案
按热度按时间uyhoqukh1#
你的问题是强制转换
hwnd =<HWND> HandleToWindow
得到了一个指向你作为HandleToWindow
传递的PyObject
的指针,而不是根据HandleToWindow
的内容设置一个空指针。一个解决方案是创建一个Cython类
字符串
然后使用它(在函数
PyMessage
中,以及在Python中需要传递这些句柄的任何其他地方)作为型
你也可以用这个方法直接传递NULL指针,而不是使用字符串。