gpt4 book ai didi

c - 尝试从 Tcl 将指针传递给 API 函数

转载 作者:行者123 更新时间:2023-11-30 17:36:03 25 4
gpt4 key购买 nike

我正在尝试编写一个 Tcl 脚本来与 FTDI USB 设备(Windows 平台)连接。我已经从 FTDI API 获得了具有单个输入参数的函数,但一个名为“FT_GetDeviceInfoDetail”的 API 函数让我感到悲伤。

API函数调用如下:

FT_STATUS FT_GetDeviceInfoDetail (DWORD dwIndex, LPDWORD lpdwFlags, LPDWORD lpdwType, LPDWORD lpdwID, LPDWORD lpdwLocId, PCHAR pcSerialNumber, PCHAR pcDescription, FT_HANDLE *ftHandle)

其中LPDWORD、PCHAR和FT_HANDLE都是指向不同大小的内存空间的指针。

使用 ffidl,我指定函数调用如下:

ffidl::callout _GetDeviceInfoDetail {uint32 pointer-var pointer-var \
pointer-var pointer-var pointer-var pointer-var \
pointer-var} uint32 \
[ffidl::symbol $dll FT_GetDeviceInfoDetail]

这就是有趣的地方。在 Tcl 中,对于传递给 API 的所有指针参数,我设置如下变量: 设置变量名称 [二进制格式 s 0]

当我调用该函数时,我为所有指针传递变量名称(即“foo”,而不是“$foo”),并且(有点奇迹般地)该函数返回“OK”状态。此时,理论上我传入的变量内容会包含一些二进制字符串格式的数据。

然后,我尝试通过执行以下操作“重新构造”二进制数据的字符串表示形式:

[binary scan $foo s outstring]

此时 Windows 介入并告诉我“Tclsh 已停止工作”。

我怀疑该函数正在覆盖一个或多个变量的内存空间,但我不知道该怎么办。到目前为止,也许我想到的最好的想法是为 Tcl 编写一个 C 扩展,它将调用 API,填充数据结构,然后以某种方式将该结构传递回 Tcl。

任何人都可以向我指出一种在纯 Tcl 中执行此操作的方法吗? (抱歉这个双关语;我无法抗拒!)

最佳答案

我的菲德尔有点生锈了,所以请耐心等待。我怀疑是因为您要传递的变量名称设置为:

set varname [binary format s 0]

lpSerialNumber 和 lpDescription 字段导致覆盖。这两个字段都可以长达 16 个字节。对于这些字段,初始化为 16 字节空字符串的变量可能有效,即

set serno [string repeat "\0" 16]
例如,

应该为您提供 lpSerialNumber 字段所需的空间。不管怎样,这就是我在这种情况下会尝试的。

关于c - 尝试从 Tcl 将指针传递给 API 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22820657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com