python - 从带有 char 缓冲区的 DLL 为 C 函数创建 python 回调。
问题描述
我正在尝试为 C DLL 创建一个 python 包装器。C DLL 使用回调通过 UDP 从 DLL“发送”消息。
我期望发生的是 python 代码将加载 DLL 库和两个函数。RegisterCallbackSendMessage
然后它将使用该函数向 DLL 注册回调。指向回调的指针将存储在 DLL 内存空间的内存中。然后 python 代码将调用 SendWhoIs DLL 函数。该函数将创建一个缓冲区并使用 SendMessage 函数指针将消息从 DLL 发送到 python 代码。
我遇到的问题是python函数中的message
参数SendMessage
不知道如何解释a void *
,我无法将此缓冲区传递给sock.sendto
函数。
我收到以下错误。
sock.sendto(message, (UDP_IP, UDP_PORT))
TypeError: a bytes-like object is required, not 'int'
我的问题是:如何将 c_void_p 转换为 sock.sendto 可以接受的字节数组。?
我试图尽可能地减少我的代码,并且仍然使它易于理解。
这是我的 C 代码
// C DLL code
//
#define DllExport extern "C" __declspec( dllexport )
typedef uint16_t(*FPCallbackSendMessage)(const uint8_t * message, const uint32_t length);
FPCallbackSendMessage g_CallbackSendMessage;
DllExport bool RegisterCallbackSendMessage(uint16_t(*p_CallbackSendMessage)(const uint8_t * message, const uint32_t length)) {
g_CallbackSendMessage = p_CallbackSendMessage ;
return true;
}
void SendWhoIs(unsigned int dd) {
printf("dd=%d", dd);
char buffer[500];
g_CallbackSendMessage( buffer, 500 );
}
这是我的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")
解决方案
我想到了。
在 python SendMessage 函数中,我想出了一种将 c_void_p 转换为字节数组的方法。
# convert the pointer to a buffer.
buffer = c_char * length
messageToSend = buffer.from_address(message)
推荐阅读
- react-native - 在另一个 React-Native 库中使用 React-Native 库
- ios - Swift-可重用的框架在更高版本的 xcode 中不起作用
- python - Python List Comprehensions, sublist row and column
- rest - 添加 RGW 实例时 Ceph 状态 HEALTH_WARN
- javascript - 锚元素上的下载属性在 Firefox 上不起作用
- http - @ 字符在 HTTP 地址路径中是否常见?我们可以在 HTTP 地址路径中使用它吗?
- c++ - “+=”运算符到底是做什么的?
- python - 如果系列的值包含熊猫中的一组特定字符,则替换后续字符
- vimium - Vimium 中插入模式的用例是什么,它在哪里记录?
- r - 过滤数据的月末日期