Функция обратного вызова Python ctypes для SWIG - PullRequest
5 голосов
/ 09 января 2010

У меня есть функция SWIG C ++, которая ожидает указатель функции (WNDPROC), и хочу передать ей функцию Python, которая была обернута в ctypes.WINFUNCTYPE.

Мне кажется, что это должно быть совместимо, но проверка типа SWIG вызывает исключение, потому что он не знает, что тип ctypes.WINFUNCTYPE фактически является WNDPROC.

Что я могу сделать, чтобы передать свой обратный вызов SWIG, чтобы он его понимал?

1 Ответ

3 голосов
/ 16 марта 2010

У меня нет машины с Windows, чтобы действительно это проверить, но я думаю, что вам нужно создать карту типов, чтобы сообщить swig, как конвертировать оболочку PyObject в WNDPROC:

// assuming the wrapped object has an attribute "pointer" which contains 
// the numerical address of the WNDPROC
%typemap(in) WNDPROC {
    PyObject * addrobj = PyObject_GetAttrString($input, "pointer");
    void * ptr = PyLong_AsVoidPt(addrobj);
    $1 = (WNDPROC)ptr;
}
...