【问题标题】:Python ctypes passing string pointer / bufferPython ctypes 传递字符串指针/缓冲区
【发布时间】: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

GetDLLVersion的

声明:
ERR_CODE GetDLLVersion (char *versionStr, uint32_t maxLen);
参数:
uint32_t maxLen
说明:
字符串缓冲区的长度。如果版本信息更长 maxLen 它被截断。字符串以空值结尾。

ExecSCmdGetString的

声明:
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?

【问题讨论】:

    标签: python c ctypes


    【解决方案1】:

    像这样:

    paramValue = create_string_buffer(32)
    maxLen = c_uint32(32)
    errCode = libc.ExecSCmdGetString(sensor, b'Get_Info', b'SA_Sensor', paramValue, byref(maxLen))
    

    您的第一次尝试没有成功,因为 maxLen 是 uint32_t *,但您只是传递了 uint32_t。将其包裹在 byref() 中可以解决此问题。

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多