Cython Package C++ WHND转换指针

rmbxnbpk  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(109)

我尝试用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)

uyhoqukh

uyhoqukh1#

你的问题是强制转换hwnd =<HWND> HandleToWindow得到了一个指向你作为HandleToWindow传递的PyObject的指针,而不是根据HandleToWindow的内容设置一个空指针。
一个解决方案是创建一个Cython类

cdef class PyHandleToWindow:
   HWND ptr
   def __cinit__(self):
     self.ptr = NULL

字符串
然后使用它(在函数PyMessage中,以及在Python中需要传递这些句柄的任何其他地方)作为

cpdef PyMessage(self,handle_to_window):
  # code to deal with null goes here?
  hwnd = <PyHandleToWindow?>handle_to_window # note the question mark to test if the cast is valid
  return self.thisptr.Message(hwnd.ptr, u"Hello Cython \u263a", title, 0)


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

相关问题