关于 Python 调用 dll 求助

查看 55|回复 2
作者:aizya   
python 小白,现在需要使用 python 去调一个第三方的 dll 文件,dll 没法改,下面是 dll 中的数据结构
/*----------------------------------------------------------------------------
|
| Define pointers
|
-----------------------------------------------------------------------------*/
#ifndef PL_BYTE
#define PL_BYTE uint8_t *
#endif
/*----------------------------------------------------------------------------
|
| Define structs
|
-----------------------------------------------------------------------------*/
typedef struct DEMO_t
{
  uint16_t        length;
  PL_BYTE       payLoad;                    /* 长度取决于 length 的值*/
} DEMO;
这个 dll 中有个 read 方法,可以从文件中读取出对应的 DEMO 数据。下面是 python 的代码:
# 定义 BL_LPBYTE 类型
BL_LPBYTE = ctypes.POINTER(uint8_t)
class DEMO_DATA(ctypes.Structure):
    _fields_ = [
        ("length", ctypes.c_uint16),
        ("payLoad", BL_LPBYTE),
    ]
# 加载 dll
dll = ctypes.CDLL('demo.dll')
# 定义 dll 中的 Read 方法, 其实我也不太懂为什么要这样
dll.Read.argtypes = [ctypes.c_void_p, ctypes.POINTER(DEMO)]
dll.dll.restype = ctypes.c_int32
# 创建文件,数据源
handle = dll.Create('file.target')
# 创建结构体
demo = DEMO()
# 读取数据,正常传入文件以及结构体,dll 会自动像结构体中存入数据
dll.Read(handle,ctypes.byref(demo))
问题: 在调用 dll 提取数据的时候,结构体中 length 字段是正常的,ctypes 定义了 BL_LPBYTE 这部分数据一直都拿不到。 请教大家应该要怎么做?

dll, ctypes, Demo, bl_lpbyte

morenacl   
https://docs.python.org/zh-tw/3.9/library/ctypes.html
NessajCN   
BL_LPBYTE = ctypes.POINTER(ctypes.c_uint8)
您需要登录后才可以回帖 登录 | 立即注册

返回顶部