微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python包装到Ccallback

试图创build一个pythoncallback,它需要在调用Windows环境中的dll的Ccallback时被调用。 请查看下面的代码以了解问题。

from ctypes import * #---------qsort Callback-------------# IntArray5 = c_int * 5 ia = IntArray5(5,1,7,33,99) libc = cdll.msvcrt qsort = libc.qsort qsort.restype = None CMPFUNC = CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int) ) test = 0 def py_cmp_func(a,b): #print 'py_cmp_func:',a[0],b[0] global test test = 10000 return a[0]-b[0] cmp_func = CMPFUNC(py_cmp_func) qsort(ia,len(ia),sizeof(c_int),cmp_func) print "global test=",test for item in ia : print item #----------Load DLL & Connect ------------# gobiDLL = WinDLL("C:LMSQCWWAN2k.dll") print 'Output of connect : ',gobiDLL.QCWWANConnect() #----------SetBytetotalsCallback----------# tx = POINTER(c_ulonglong) rx = POINTER(c_ulonglong) proto_callback = WINFUNCTYPE(c_void_p,tx,rx) gtx = grx = 0 # Used to copy the response in the py_callback def py_callback(t,r): sleep(10) print 'python callback ...' print "tx=",t,"rx=",r global gtx,grx gtx = 5000 # gtx = t grx = 2000 # grx = r #return 0 callback = proto_callback(py_callback) gobiDLL.SetBytetotalsCallback.restype = c_ulong gobiDLL.SetBytetotalsCallback.argtypes = [proto_callback,c_byte] print "SetBytetotalsCallback = ",gobiDLL.SetBytetotalsCallback(callback,c_byte(256)) print "gtx = ",gtx print "grx = ",grx

DLL文档原型和SetBytetotalsCallback()方法的callback,如下所示。

原型:

ULONG QCWWANAPI2K SetSessionStateCallback( tFNSessionState pCallback );

回电话 :

我如何在运行时编写Python文件

SetFilePointerEx API来读取MFT

如何创build一个cpp程序,执行时不显示任何窗口

我怎样才能使菜单forms留在屏幕上,在所有其他应用程序的顶部?

确定由Windows GUI操作触发的底层调用

void BytetotalsCallback( ULONGLONG txTotalBytes,ULONGLONG rxTotalBytes );

输出

>>> global test= 10000 1 5 7 33 99 Output of connect : 0 SetBytetotalsCallback = 0 gtx = 0 grx = 0 >>>>

目前的问题是整个程序被调用正确,但pythoncallback不会被调用。 程序以gobiDLL.SetBytetotalsCallback(callback,c_byte(256))方法的0状态退出,但是在调用过程中不调用python编写的callback()方法

你能指出什么可以帮助进入pythoncallback? 另一个示例qsort()方法将指针传递给python函数指针。 在这里得到这个问题的根本原因的损失。

TIA,

安东尼

如何在script.py中调用特定的Python版本 – Windows

如何使用GDI +库来解码内存中的jpeg?

Python中的相对path问题

Python:Howto启动一个完整的进程而不是subprocess并检索PID

在模式对话框上显示MessageBox后,ALT + TAB不起作用

你不能。 C / C ++函数不能直接访问Python函数函数原型可能期望指向C的指针.Python会传递一个指向该特定函数的内部数据结构的指针。

现在是时候建立一个C扩展到Python来包装该DLL并将其展示给Python。 你要做的事情基本上是C回调调用Python回调,因为可以做到这一点。 更清楚的是,你想要达到的是:

| This side is C land ie "real" addresses | Python objects --> C extension -- register callback with --> DLL | | in the python | Calls callback | | interpreter <-------------- Callback in C extension <------- |

下面是从C构建一个python函数一个非常快速的解释。您将需要使用MSVC(或替代工具)来构建您的Python分发版本; 使用depends.exe来找出它链接到哪个msvcXX.dll 。

全球国家通常被认为是不好的,但为了简单起见,我使用了:

static PyObject* pyfunc_event_handler = NULL; static PyObject* pyfunc_event_args = NULL;

然后我添加一个处理函数来使设置回调的过程更容易。 但是,你不需要那样做,你只需要

static PyObject* set_event_handler(PyObject *self,PyObject *args) { PyObject *result = NULL; PyObject *temp;

下一行是重要的 – 我允许传递两个python对象( O参数到PyArg_ParseTuple 。一个对象包含函数,其他参数。

if (PyArg_ParseTuple(args,"OO",&temp,&pyfunc_event_args)) { if (!PyCallable_Check(temp)) { PyErr_SetString(PyExc_TypeError,"parameter must be a function"); return NULL; }

分类参考。 Python需要你这样做。

Py_XINCREF(temp); /* Add a reference to new func */ Py_XDECREF(pyfunc_event_handler); /* dispose of prevIoUs callback */ pyfunc_event_handler = temp; /* Remember new callback */ /* Boilerplate to return "None" */ Py_INCREF(Py_None); result = Py_None; } return result; }

您可以在其他地方用以下方式呼叫:

PyObject* arglist = Py_BuildValue("(O)",pyfunc_event_args); pyobjresult = PyObject_CallObject(pyfunc_event_handler,arglist); Py_DECREF(arglist);

不要忘了DECREF ,你需要Python来gc arglist。

从python,使用这是如此简单:

set_event_handler(func,some_tuple)

func的匹配参数如下所示:

def func(obj): /* handle obj */

你可能想要读的东西:

LoadLibrary (从C加载DLL)。

GetProcAddress (找到一个函数调用)。

从Python文档中使用C或C ++扩展Python 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐