从带有字符缓冲区的DLL为C函数创建python回调。

2024-04-26 20:29:10 发布

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

我正在尝试为一个C DLL创建一个python包装器。C DLL使用回调通过UDP从DLL“发送”消息。在

我期望的是python代码将加载DLL库和这两个函数。然后它将使用RegisterCallbackSendMessage函数向DLL注册回调。指向回调的指针将存储在DLL内存空间的内存中。然后python代码将调用sendwois DLL函数。这个函数将创建一个缓冲区,并使用SendMessage函数指针将消息从DLL发送到python代码。在

我遇到的问题是,python中SendMessage函数中的message参数不知道如何解释void *,我无法将这个缓冲区传递给sock.sendto函数。在

我得到以下错误。在

sock.sendto(message, (UDP_IP, UDP_PORT))
TypeError: a bytes-like object is required, not 'int'

我的问题是:如何将c_void_p转换为短袜发送到能接受吗。?在

我已经尽可能地减少我的代码,并且仍然使它可以理解。在

这是我的C代码

^{pr2}$

这是我的python代码

# Python code 
# =================
print("Start") 

customDLL = cdll.LoadLibrary ("customeDLL.dll")

def SendMessage( message, length ):
    print("SendMessage...") 
    UDP_IP = "192.168.1.1"
    UDP_PORT = 47808
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.sendto(message, (UDP_IP, UDP_PORT))
    return True 

print("Registering Callback SendMessage...") 
SendMessageFUNC = CFUNCTYPE(c_bool, c_void_p, c_uint)
SendMessage_func = SendMessageFUNC( SendMessage )

RegisterCallbackSendMessage = customDLL.RegisterCallbackSendMessage
RegisterCallbackSendMessage.argtypes = [ SendMessageFUNC ]
RegisterCallbackSendMessage( SendMessage_func ) 

print("Do message...") 
SendWhoIs = BACnetStackDLL.SendWhoIs
SendWhoIs.argtypes = [c_uint]

SendWhoIs( 47 )

print("End") 

Tags: 函数代码ipmessageportsocketsockudp
1条回答
网友
1楼 · 发布于 2024-04-26 20:29:10

我想出来了。在

在pythonsendmessage函数中,我找到了一种将c_void_p转换为字节数组的方法。在

# convert the pointer to a buffer. 
buffer = c_char * length 
messageToSend = buffer.from_address(message)

相关问题 更多 >