如何在ctypes中从.dll接收回调函数消息?

2024-09-30 22:11:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Ctypes调用.dll函数。 我有一个麻烦,那就是得到一个回调函数值。 如果我调用回调函数,函数不会给出值。 我的python代码有什么问题?你知道吗

void __stdcall callbackmessage(int msgT, char* msg, void* data)
typedef void (__stdcall *CALLBACK)(int, char*, void*);
extern "C" _declspec(dllimport) void    __stdcall callbackfunc(CALLBACK callback, void* userdata);
import sys, ctypes
from ctypes import *
from ctypes import wintypes, POINTER

Load_DLL = WinDLL("test.dll")
sys.stdout = open('stdout.txt', 'w')

CONNECT= 4116
DISCONNECTED = 4113

def callbackmessage(msgT, msg, data):
     if msgT == 4113:
         print (b"disconnected!")
     elif msgT == 4116:
         print ("Connect!!")


CALLBACK = WINFUNCTYPE( c_int, POINTER(c_char), POINTER(c_void_p))

callbackfunc = Load_DLL.callbackfunc
callbackfunc.argtypes = [CALLBACK, c_void_p]
callbackfunc.restype = c_void_p
CALLBACKMESSAGE = CONNECT|DISCONNECTED
messageprocess = CALLBACK(callbackmessage)

callbackfunc(messageprocess, CALLBACKMESSAGE)

Tags: 函数importdatacallbackmsgctypesintdll
1条回答
网友
1楼 · 发布于 2024-09-30 22:11:03

提到[Python 3.Docs]: ctypes - A foreign function library for Python。你知道吗

我发现代码有几个问题:

  1. callbackmessage的Python签名没有反映真实的签名(来自C)。若要更正,请将其更改为:

    CALLBACK = WINFUNCTYPE(None, c_int, POINTER(c_char), c_void_p)  # Adding 1st arg which is the return type; 3rd arg might also be c_char_p
    
  2. 我不确定callbackfunc如何解释它的2nd参数,但是放置CALLBACKMESSAGE似乎是错误的。我会这样做:

    callbackfunc(messageprocess, byref(c_int(CALLBACKMESSAGE)))
    
  3. 您确定(在C中)callbackfunc_declspec(dllimport)吗?我想应该是__declspec(dllexport)

  4. callbackfunc.restype = None(小调)。voidvoid指针(c\u void\u p)不是同一事物

  5. 最后但并非最不重要的一点:这是一个逻辑错误:CALLBACKMESSAGE = CONNECT | DISCONNECTED这将产生一个值4117,如果这是callbackmessage的1starg,它将不会打印任何内容。因此,选择一个值(例如CALLBACKMESSAGE = CONNECT

相关问题 更多 >