Tag: libffi

用cffi-libffi按值传递结构?

我的印象是CFFI无法通过值传递结构,但CFFI文档说: 要按值传递或返回结构到函数,请加载cffi-libffi系统并将结构指定为(:struct structure-name) 。 要传递或返回指针,可以使用:pointer或(:pointer (:struct structure-name)) 。 我正在重新包装cl-opencv函数get-size ,它是这个opencv函数的包装器: CvSize cvGetSize(const CvArr* arr) 因为我不认为当cl-opencv的作者编写库时,CFFI能够通过cffi-libffi系统按值传递结构,所以他必须使用以下所有代码来包装cvGetSize : (defmacro make-structure-serializers (struct slot1 slot2) “Create a serialization and deserialization function for the structure STRUCT with integer slots SLOT1 and SLOT2. These functions will pack and unpack the structure into an INT64.” (let ((pack-fn (intern (concatenate ‘string (string struct) […]

如何编写用于调用Win32函数的通用C函数?

为了允许从脚本语言(用C编写)访问Win32 API,我想编写如下函数: void Call(LPCSTR DllName, LPCSTR FunctionName, LPSTR ReturnValue, USHORT ArgumentCount, LPSTR Arguments[]) 一般来说,它会调用任何Win32 API函数。 (LPSTR参数基本上用作字节数组 – 假设它们的大小正确,以便在函数外部采用正确的数据类型。另外我认为需要一些额外的复杂性来区分指针和非指针参数但我为了这个问题的目的,我忽略了这一点。 我遇到的问题是将参数传递给Win32 API函数。 因为这些是stdcall我不能使用varargs所以’Call’的实现必须提前知道参数的数量,因此它不能是通用的… 我想我可以使用汇编代码(通过循环遍历参数,将每个参数推送到堆栈)来实现这一点但是在纯C中这是可能的吗? 更新:我已经标记了现在已经接受的“不可能”答案。 如果基于C的解决方案曝光,我当然会改变这一点。 更新: ruby / dl看起来可能使用合适的机制实现。 任何有关这方面的细节将不胜感激。

在C中,给定变量参数列表,如何使用它们构建函数调用?

假设有一个以某种方式存储的参数列表,例如,在数组中。 给定一个函数指针 ,如何调用它来传递存储的参数列表? 我不是试图将数组作为参数传递好。 你明白了,好吗? 我想将每个元素作为参数传递。 数组只是为了说明,我可以将参数存储在一些元组结构中。 另外,看看我手头有一个函数指针,并且可能有字符串格式的签名 。 我不是只想定义一个能够处理可变列表的函数。 我看到如何做到这一点的唯一方法是使用汇编(通过__asm push et al。)或者: void (*f)(…); int main() { f = ; int args[]; int num_args = ; switch(num_args) { case 0: f(); break; case 1: f(args[0]); break; case 2: f(args[0], args[1]); break; /* etc */ } return 0; } 我不太喜欢这种做法…… 还有另一种便携式和更短的forms吗? 几种脚本语言可以调用C函数。 Python或Ruby等脚本语言如何做到这一点? 他们如何以便携方式实现它? […]