我有一个名为Foo.dll
的Windows DLL。它导出(除其他外)以下内容:
extern "C" __declspec(dllexport) unsigned int Version();
我应该如何编写一个 Haskell 程序,调用这个函数并输出结果?
我发现可以这样写:
foreign import ccall "Version" cpp_Version :: CUInt
这段代码编译没有问题,但链接时却出现了严重错误。这并不奇怪;此时 GHC 完全不知道该从哪里寻找这个函数。但我无法弄清楚需要按哪个神奇的按钮才能解决这个问题。有人能告诉我如何成功构建吗?
(我也不确定调用约定应该是ccall
还是stdcall
;它们有什么区别?)
stdcall
是 Win32API 的调用约定,ccall
则是几乎所有其他情况——当然包括 GCC(MinGW/MSYS)和 Unix。OpenGL 使用的是 ccall [http://www.haskell.org/pipermail/libraries/2011-June/016505.html],我不确定它现在是否仍在使用。同样,我也不确定使用 Visual Studio 编译的 .DLL 文件会使用哪种调用约定。 - stephen tetley