我正在尝试使用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)
提到[Python 3.Docs]: ctypes - A foreign function library for Python。你知道吗
我发现代码有几个问题:
callbackmessage的Python签名没有反映真实的签名(来自C)。若要更正,请将其更改为:
我不确定callbackfunc如何解释它的2nd参数,但是放置CALLBACKMESSAGE似乎是错误的。我会这样做:
您确定(在C中)callbackfunc是
_declspec(dllimport)
吗?我想应该是__declspec(dllexport)
callbackfunc.restype = None
(小调)。void和void指针(c\u void\u p)不是同一事物最后但并非最不重要的一点:这是一个逻辑错误:
CALLBACKMESSAGE = CONNECT | DISCONNECTED
这将产生一个值4117,如果这是callbackmessage的1starg,它将不会打印任何内容。因此,选择一个值(例如CALLBACKMESSAGE = CONNECT
)相关问题 更多 >
编程相关推荐