【问题标题】:Python Ctypes function call from dll issue来自 dll 问题的 Python Ctypes 函数调用
【发布时间】:2016-12-08 14:20:55
【问题描述】:

我需要用 python 调用 dll 函数。

函数是:

int cbGetConfigString(int InfoType, int BoardNum, int DevNum, int ConfigItem, char *ConfigVal, int* maxConfigLen)

参数

信息类型

每个板的配置信息被分组到不同的 类别。此参数指定您想要的类别。总是 将此参数设置为 BOARDINFO。

BoardNum

安装时与板关联的编号 InstaCal 或使用 cbCreateDaqDevice() 创建。 BoardNum 可以是 0 到 99。

DevNum

DevNum 参数的用途取决于 ConfigItem 是 通过了。它可以作为开始读取的点,一个索引 到 ConfigItem 中,也可以忽略。

配置项

要从设备读取的信息类型。将其设置为其中之一 下面的“ConfigItem 参数值”部分中列出的常量。

配置值

指向配置字符串所在的用户分配缓冲区的指针 复制。

ma​​xConfigLen

指向保存要读取的最大字节数的值的指针 从设备到 ConfigVal。

请帮助我理解我的代码有什么问题:

import ctypes

mccdaq=ctypes.WinDLL("C:\\Program Files (x86)\\Measurement Computing\\DAQ\\cbw32.dll")

Open=mccdaq.cbGetConfigString
Open.argtypes =[ctypes.c_int,ctypes.c_int,ctypes.c_int,ctypes.c_int,ctypes.POINTER(ctypes.c_char),ctypes.POINTER(ctypes.c_int)]

INTP=ctypes.POINTER(ctypes.c_int)
num=ctypes.c_int(8)
addr=ctypes.addressof(num)
ptr=ctypes.cast(addr,INTP)

mem=ctypes.c_char()

print Open(2,0,0,363,ctypes.byref(mem),ctypes.byref(num))
print mem
print num

输出:

0 - 没有错误

c_char('1') - 应该是 125E737

c_long(7) - 看起来正确的字符数..

【问题讨论】:

  • 我认为你通常会使用 create_string_buffer() 来表示 ConfigVal / mem 并使用普通的 c_intby_ref 作为 int 指针。
  • 按原样,cytpes.c_char_p() 不分配任何后备存储,它只是给你一个指针。所以很有可能,你的代码在调用时会出现段错误。
  • 你知道相关DLL的minimal required setting/data吗? C:\\Program Files(X86) 与 64 位 DLL ?如果您注册了操作系统,可以致电ctypes.WinDLL("cbw64.dll")!为什么 ?需要一些驱动程序包来扫描/打开端口/设备....
  • dll路径也有错别字(缺少转义反斜杠):(x86)\Measurement;应该是(x86)\\Measurement
  • 好的,我更新了我的代码..仍然得到错误的字符值,但至少函数返回 0“无错误”请协助

标签: python c dll ctypes


【解决方案1】:

好的,我找到了问题:)

import ctypes

mccdaq=ctypes.WinDLL("C:\\Program Files (x86)\\Measurement Computing\\DAQ\\cbw32.dll")

Open=mccdaq.cbGetConfigString
Open.argtypes =[ctypes.c_int,ctypes.c_int,ctypes.c_int,ctypes.c_int,ctypes.POINTER(ctypes.c_char*8),ctypes.POINTER(ctypes.c_int)]

num=ctypes.c_int(8)
mem=(ctypes.c_char*8)()

print Open(2,0,0,363,ctypes.byref(mem),ctypes.byref(num))
print mem.value
print num   

现在的输出是:

0

125E737

c_long(7)

【讨论】:

  • 你的第五个参数应该是ctypes.c_char_p
  • 通常,使用mem = ctypes.create_string_buffer(8) 创建一个正确大小的可写缓冲区。但是,您会得到相同的结果。也不需要ctypes.byref(mem)mem 已经是正确的类型 (char*)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多