【发布时间】: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 参数值”部分中列出的常量。
配置值
指向配置字符串所在的用户分配缓冲区的指针 复制。
maxConfigLen
指向保存要读取的最大字节数的值的指针 从设备到 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_int和by_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“无错误”请协助