从Haskell调用DLL

时间:2014-02-27 14:14:49

标签: haskell dll

我有一个名为Foo.dll的Windows DLL。它出口(以下其他东西):

extern "C" __declspec(dllexport) unsigned int Version();

如何编写调用此函数并打印出答案的Haskell程序?

我设法弄明白我可以这样写:

foreign import ccall "Version" cpp_Version :: CUInt

这编译得很好,但完全无法链接。这并不奇怪;在这一点上,GHC 不知道在哪里寻找这个功能。但我无法弄清楚我需要推动什么魔术按钮来实现这一目标。谁能告诉我如何成功建立这个?

(我也不能100%确定调用约定是ccall还是stdcall;有什么区别?)

1 个答案:

答案 0 :(得分:1)

使用以下选项进行编译 可以正常工作:

ghc -O2 -L. -lFoo --make Wrapper

似乎添加-lFoo告诉GHC查找Foo.dll文件,添加-L.告诉它将当前目录包含在DLL搜索路径中。

我不是100%确定这是在运行时加载DLL,还是以某种方式将DLL的代码静态链接到二进制文件中。 (!!)

ccall更改为stdcall会导致发出大量警告(但编译后的代码仍能正常工作)。因此,出现 ccall是正确的。

如果有人能够仔细检查我所写的内容并非完全无稽之谈,我仍然会感激...