【发布时间】:2020-04-26 13:06:05
【问题描述】:
我正在尝试使用 Python 通过其 DLL 从传感器获取信息。
我以前从未使用过 ctypes 或 C,所以我对此缺乏一些知识,希望有人可以帮助我。
调用函数到目前为止工作,但我无法让函数返回字符串信息。
到目前为止有效的方法:
from ctypes import *
libc = windll.LoadLibrary("MEDAQLib.dll")
version = create_string_buffer(15)
libc.GetDLLVersion(version, 15)
print(version.value.decode())
这将返回 DLL 的版本号并正常工作。
现在我尝试以相同的方式获取有关传感器的一些信息。
# Create sensor instance and open connection
sensor = libc.CreateSensorInstance(42)
libc.OpenSensorRS232(sensor, b'COM4')
# Try to get information from sensor
name = create_string_buffer(32)
libc.ExecSCmdGetString(sensor, b'Get_Info', b'SA_Sensor', name, 32)
print(name.value.decode())
ExecSCmdGetString 函数失败并显示OSError: exception: access violation reading 0x0000000000000020
声明:ERR_CODE GetDLLVersion (char *versionStr, uint32_t maxLen);
参数:
uint32_t maxLen
说明:
字符串缓冲区的长度。如果版本信息更长
maxLen 它被截断。字符串以空值结尾。
声明:ERR_CODE ExecSCmdGetString (uint32_t instanceHandle, const char *sensorCommand,
const char *paramName, char *paramValue, uint32_t *maxLen);
参数:
uint32_t * maxLen
说明:
缓冲区必须由应用程序分配。的大小
缓冲区在 maxLen 处指定。如果结果字符串大于
maxLen,它被截断并返回 ERR_NOMEMORY (-19)。这
字符串的实际长度(可能被截断)也在 maxLen 中返回。
如果 paramValue 为 nullptr,则返回包含字符串的长度
在 maxLen 中。
显然我不能再将 maxLen 指定为整数了。
但是那我该怎么做呢?
我也试着做一个指针:
name = c_char_p()
libc.ExecSCmdGetString(sensor, b'Get_Info', b'SA_Sensor', byref(name))
那么我该如何指定 maxLen?
【问题讨论】: