问题标签 [ffi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3220 浏览

dll - DLL函数上的Haskell外部导入stdcall

这可能是一个非常容易回答的问题,但出于某种原因,我真的很挣扎。

我有一个用 C 语言编写的 DLL,用于在协议级别访问硬件,我想编写一个 Haskell 程序来调用其中一些 C 函数。这是相关 C 标头的片段(由于可能的版权问题,名称只是稍微混淆了):

这已在 Visual Studio 2003 中编译为 DLL,并且我已成功从 C 和 C# 加载 DLL,因此我确信 DLL 可以正常工作。该 DLL 被命名为“hw-driver.dll”。

接下来,这是 Haskell 源代码,只是为了测试我是否可以正确加载 DLL 并在其中调用最简单的函数:

给我带来麻烦的线是外国进口线。据我了解,语法是 foreign (import/export) (ccall/stdcall) library-name C-function-name haskell-function-name :: Haskell type declaration。所以我的应该是foreign import stdcall(因为你在Win32中加载DLL时使用stdcall)“hw-driver”(因为文件名为“hw-driver.dll”并且它与dlltest.hs位于同一目录中) “HW_Init”(C 中函数的名称) hwInit :: IO (Cint)(无效参数,返回一个 int)。

但是,当我尝试运行时ghci dlltest.hs,我得到以下输出:

第 8 行第 43 列是 HW_Init 上的第一个引号。好的,所以也许我必须将库名称和函数名称放在一个字符串中,我已经在几个地方看到过。如果我尝试运行它,那么我得到:

8:23 是新字符串“hw-driver HW_Init”的第一个引号。

我不相信我的 ghc 设置 (6.10.3) 有任何问题,因为我可以在 ghci 中运行从 Real World Haskell 复制粘贴的以下代码:

这么长的问题,我如何正确地在 Win32 DLL 上声明一个外部导入?我在谷歌上找不到任何东西

为了解决这个问题,我是否能够使用 c2hs 或 hsc2hs 之类的程序来解析头文件hw-driver.h,这样我就不必为该 DLL 中包含的所有 20-25 函数手动编写外部导入调用? 我也找不到任何像样的例子。


编辑: ehemient 指出,外国进口行的正确语法是:

有了这个,我可以调用ghci dlltest.hs -lhw-driver并正确调用主函数并返回成功的代码。但是,该命令ghc --make dlltest.hs -lhw-driver因链接器错误而失败。因此,这是该命令的详细输出(请注意,我在工作目录中有所有 hw-driver.{dll,h,lib} ):


事实证明,实际的链接并不像我想象的那么困难。我正在使用foreign import stdcall我认为在 Visual Studio 2003 中构建的 DLL 是正确的。我必须下载pexportsMinGW 的工具,其中列出了从 DLL 导出的函数。链接器一直在寻找 HWInit@0,但pexports说 DLL 只导出了 HWInit。

我将我的行改为,并且由于工作目录中同时存在 .lib 和 .dll 文件,foreign import ccall我能够成功地链接程序。ghc --make dlltest.hs hw-driver.libghc --make dlltest.hs -L. -lhw-driver

0 投票
2 回答
955 浏览

haskell - Haskell:如何获取#define-d 常量的值?

在 Haskell 程序中,使用 C 头文件中定义的常量的最佳方法是什么?

0 投票
5 回答
6990 浏览

c++ - 从 C++ 生成 C 包装器?

我想从 C++ 库生成 C 包装器。有关于如何手动操作的教程:

但这太费体力了。

例如,为此:

我需要写:

是否有可以自动化此过程的工具?

0 投票
2 回答
2045 浏览

c - 实现外部函数接口的指南

现在我正在研究一种还没有 FFI 的脚本语言。我想知道最方便的获取方式是什么,假设我想像酷极客那样编写它——我想用脚本语言本身编写 FFI。

我需要接口的编程语言是 C。所以对于基础知识,我知道 libdl.so 是我最好的朋友。显然,这不是我唯一需要的东西,而是其中最重要的东西。

我对我还需要什么只有一点点想法。我想从 FFI 获得与 python ctypes 类似的行为。

为了做到这一点,我需要知道什么?我知道我需要处理的数据结构有一些严重的魔力。我该如何管理它,以便我可以在脚本语言本身中完成大部分严肃的魔法?我会从这种魔法中获得更多的用途,而不仅仅是外部函数接口。例如,我可能想将类似 C 的二进制数据传递给文件。

0 投票
1 回答
334 浏览

c - SBCL 存储大图的效率如何?

在内存中处理大量对象时,垃圾收集器对性能的影响有多大,内存分配和解除分配开销有多大?使用 SBCL 执行此操作是否明智,或者构建一个小型 C 库以通过 FFI 连接更好?

0 投票
4 回答
3532 浏览

.net - 在 .NET 中调用 Haskell 函数

string -> string我想在C# 程序中使用具有以下类型 :: 的 Haskell 函数 。

我想使用hs-dotnet来连接两个世界。作者声称这是可能的,但没有提供此案例的样本。提供的唯一示例是使用 Haskell 的 .NET 的示例。

有没有这种用法的样本,或者如何使用它?(我在桥接程序集上使用了.NET Reflector,但我什么都不懂。)

0 投票
1 回答
21385 浏览

python - 如何从 python ctypes 中取消引用内存位置?

我想在 python ctypes 中复制以下 c 代码:

我可以弄清楚如何将此内存位置称为函数指针,而不仅仅是进行正常的取消引用:

由于存在段错误,指令指针指向该内存位置,因此它成功调用了它。但是我不能让它只读取内存位置:

0 投票
4 回答
377 浏览

racket - 使用 PLT-Scheme 外部函数接口调用 mysql_real_escape_string

使用 PLT-Scheme-FFI,我想调用 C 函数

从一个方案过程并继续在调用者内部使用生成的字符串“to”。方案过程的调用将如下所示:

其中 con 是与 MySQL-DB 的有效连接,而 escape-string 定义为

问题是,我不知道要传递什么'???' 在调用 escape-string 时也不知道 escape-string 的定义是否正确。

任何帮助,将不胜感激。

问候,

拉尔夫·S。

0 投票
1 回答
294 浏览

haskell - peekCString 和 peekCStringLen 是懒惰的吗?

我有一个 C 函数,它创建一个以空结尾的字符串并返回一个指向它的指针,还有相应的释放函数。

我想从返回的 CString 中创建一个 Haskell 字符串,并尽快释放 CString。

在使用 str 之前释放 cStr 是否安全?换句话说,peekCString 是一次性创建 Haskell String,还是懒惰地创建?

0 投票
1 回答
242 浏览

ruby-on-rails - 在 ruby​​ 1.9 上运行 sqlite3 时出错:未定义的方法“更改”

这是我得到的错误。它只是突然开始

我正在使用 ruby​​ 1.9.1p243 gem 1.3.5 rails 2.3.5 ffi 0.5.4 sqlite3 0.0.3

在 ubuntu 9.10 桌面上,但我遇到了同样的问题 9.04

有谁知道是什么导致了这个错误?