问题标签 [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.
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 是正确的。我必须下载pexports
MinGW 的工具,其中列出了从 DLL 导出的函数。链接器一直在寻找 HWInit@0,但pexports
说 DLL 只导出了 HWInit。
我将我的行改为,并且由于工作目录中同时存在 .lib 和 .dll 文件,foreign import
ccall
我能够成功地链接程序。ghc --make dlltest.hs hw-driver.lib
ghc --make dlltest.hs -L. -lhw-driver
haskell - Haskell:如何获取#define-d 常量的值?
在 Haskell 程序中,使用 C 头文件中定义的常量的最佳方法是什么?
c++ - 从 C++ 生成 C 包装器?
我想从 C++ 库生成 C 包装器。有关于如何手动操作的教程:
- http://dsc.sun.com/solaris/articles/mixing.html
- http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
但这太费体力了。
例如,为此:
我需要写:
是否有可以自动化此过程的工具?
c - 实现外部函数接口的指南
现在我正在研究一种还没有 FFI 的脚本语言。我想知道最方便的获取方式是什么,假设我想像酷极客那样编写它——我想用脚本语言本身编写 FFI。
我需要接口的编程语言是 C。所以对于基础知识,我知道 libdl.so 是我最好的朋友。显然,这不是我唯一需要的东西,而是其中最重要的东西。
我对我还需要什么只有一点点想法。我想从 FFI 获得与 python ctypes 类似的行为。
为了做到这一点,我需要知道什么?我知道我需要处理的数据结构有一些严重的魔力。我该如何管理它,以便我可以在脚本语言本身中完成大部分严肃的魔法?我会从这种魔法中获得更多的用途,而不仅仅是外部函数接口。例如,我可能想将类似 C 的二进制数据传递给文件。
c - SBCL 存储大图的效率如何?
在内存中处理大量对象时,垃圾收集器对性能的影响有多大,内存分配和解除分配开销有多大?使用 SBCL 执行此操作是否明智,或者构建一个小型 C 库以通过 FFI 连接更好?
.net - 在 .NET 中调用 Haskell 函数
string -> string
我想在C# 程序中使用具有以下类型 :: 的 Haskell 函数
。
我想使用hs-dotnet来连接两个世界。作者声称这是可能的,但没有提供此案例的样本。提供的唯一示例是使用 Haskell 的 .NET 的示例。
有没有这种用法的样本,或者如何使用它?(我在桥接程序集上使用了.NET Reflector,但我什么都不懂。)
python - 如何从 python ctypes 中取消引用内存位置?
我想在 python ctypes 中复制以下 c 代码:
我可以弄清楚如何将此内存位置称为函数指针,而不仅仅是进行正常的取消引用:
由于存在段错误,指令指针指向该内存位置,因此它成功调用了它。但是我不能让它只读取内存位置:
racket - 使用 PLT-Scheme 外部函数接口调用 mysql_real_escape_string
使用 PLT-Scheme-FFI,我想调用 C 函数
从一个方案过程并继续在调用者内部使用生成的字符串“to”。方案过程的调用将如下所示:
其中 con 是与 MySQL-DB 的有效连接,而 escape-string 定义为
问题是,我不知道要传递什么'???' 在调用 escape-string 时也不知道 escape-string 的定义是否正确。
任何帮助,将不胜感激。
问候,
拉尔夫·S。
haskell - peekCString 和 peekCStringLen 是懒惰的吗?
我有一个 C 函数,它创建一个以空结尾的字符串并返回一个指向它的指针,还有相应的释放函数。
我想从返回的 CString 中创建一个 Haskell 字符串,并尽快释放 CString。
在使用 str 之前释放 cStr 是否安全?换句话说,peekCString 是一次性创建 Haskell String,还是懒惰地创建?
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
有谁知道是什么导致了这个错误?