- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能是一个非常容易回答的问题,但出于某种原因,我真的很挣扎。
我有一个用 C 语言编写的 DLL,用于在协议(protocol)级别访问硬件,我想编写一个 Haskell 程序来调用其中一些 C 函数。这是相关 C header 的片段(由于可能的版权问题,名称只是稍微混淆了):
#ifdef HWDRIVER_EXPORTS
#define HWDRIVER_API __declspec(dllexport)
#else
#define HWDRIVER_API __declspec(dllimport)
#endif
HWDRIVER_API int HW_Init(void);
{-# LANGUAGE ForeignFunctionInterface #-}
module Main
where
import Foreign
import Foreign.C
foreign import stdcall "hw-driver" "HW_Init" hwInit :: IO (CInt)
main = do
x <- hwInit
if x == 0
then putStr "Successfully initialized"
else putStr "Could not initialize"
ghci dlltest.hs
,我得到以下输出:
[1 of 1] Compiling Main ( dlltest.hs, interpreted )
dlltest.hs:8:43: parse error on input `"'
Failed, modules loaded: none.
[1 of 1] Compiling Main ( dlltest.hs, interpreted )
dlltest.hs:8:23: Malformed entity string
Failed, modules loaded: none.
{-- snippet pragma --}
{-# LANGUAGE ForeignFunctionInterface #-}
{-- /snippet pragma --}
{-- snippet imports --}
import Foreign
import Foreign.C.Types
{-- /snippet imports --}
{-- snippet binding --}
foreign import ccall "math.h sin"
c_sin :: CDouble -> CDouble
{-- /snippet binding --}
{-- snippet highlevel --}
fastsin :: Double -> Double
fastsin x = realToFrac (c_sin (realToFrac x))
{-- /snippet highlevel --}
{-- snippet use --}
main = mapM_ (print . fastsin) [0/10, 1/10 .. 10/10]
{-- /snippet use --}
hw-driver.h
所以我不必为该 DLL 中包含的所有 20-25 个函数手动编写外部导入调用?我也找不到任何像样的例子。
foreign import stdcall "hw-driver.h HW_Init" hwInit :: IO CInt
ghci dlltest.hs -lhw-driver
并使用成功的返回码正确调用主函数。但是,命令
ghc --make dlltest.hs -lhw-driver
因链接器错误而失败。因此,这是该命令的详细输出(请注意,我在工作目录中有所有 hw-driver.{dll,h,lib} ):
Glasgow Haskell Compiler, Version 6.10.3, for Haskell 98, stage 2 booted by GHC version 6.10.1
Using package config file: C:\ghc\ghc-6.10.3\package.conf
hiding package base-3.0.3.1 to avoid conflict with later version base-4.1.0.0
wired-in package ghc-prim mapped to ghc-prim-0.1.0.0
wired-in package integer mapped to integer-0.1.0.1
wired-in package base mapped to base-4.1.0.0
wired-in package rts mapped to rts-1.0
wired-in package haskell98 mapped to haskell98-1.0.1.0
wired-in package syb mapped to syb-0.1.0.1
wired-in package template-haskell mapped to template-haskell-2.3.0.1
wired-in package dph-seq mapped to dph-seq-0.3
wired-in package dph-par mapped to dph-par-0.3
Hsc static flags: -static
*** Chasing dependencies:
Chasing modules from: *dlltest.hs
Stable obj: [Main]
Stable BCO: []
Ready for upsweep
[NONREC
ModSummary {
ms_hs_date = Mon Jun 22 13:20:05 Eastern Daylight Time 2009
ms_mod = main:Main,
ms_imps = [Foreign.C, Foreign]
ms_srcimps = []
}]
compile: input file dlltest.hs
Created temporary directory: C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0
*** Checking old interface for main:Main:
[1 of 1] Skipping Main ( dlltest.hs, dlltest.o )
*** Deleting temp files:
Deleting: C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.s
Warning: deleting non-existent C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.s
Upsweep completely successful.
*** Deleting temp files:
Deleting:
link: linkables are ...
LinkableM (Mon Jun 22 13:22:26 Eastern Daylight Time 2009) main:Main
[DotO dlltest.o]
Linking dlltest.exe ...
*** Windres:
C:\ghc\ghc-6.10.3\bin/windres --preprocessor="C:\ghc\ghc-6.10.3\gcc" "-BC:\ghc\ghc-6.10.3\gcc-lib/" "-IC:\ghc\ghc-6.10.3\include/mingw" "-E" "-xc" "-DRC_INVOKED" --use-temp-file --input=C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.rc --output=C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.o --output-format=coff
*** Linker:
C:\ghc\ghc-6.10.3\gcc -BC:\ghc\ghc-6.10.3\gcc-lib/ -IC:\ghc\ghc-6.10.3\include/mingw -v -o dlltest.exe -DDONT_WANT_WIN32_DLL_SUPPORT dlltest.o -lhw-driver C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.o -LC:\ghc\ghc-6.10.3\base-4.1.0.0 -LC:\ghc\ghc-6.10.3\integer-0.1.0.1 -LC:\ghc\ghc-6.10.3\ghc-prim-0.1.0.0 -LC:\ghc\ghc-6.10.3 -LC:\ghc\ghc-6.10.3/gcc-lib -lHSbase-4.1.0.0 -lwsock32 -lmsvcrt -lkernel32 -luser32 -lshell32 -lHSinteger-0.1.0.1 -lHSghc-prim-0.1.0.0 -lHSrts -lm -lffi -lgmp -lwsock32 -u _ghczmprim_GHCziTypes_Izh_static_info -u _ghczmprim_GHCziTypes_Czh_static_info -u _ghczmprim_GHCziTypes_Fzh_static_info -u _ghczmprim_GHCziTypes_Dzh_static_info -u _base_GHCziPtr_Ptr_static_info -u _base_GHCziWord_Wzh_static_info -u _base_GHCziInt_I8zh_static_info -u _base_GHCziInt_I16zh_static_info -u _base_GHCziInt_I32zh_static_info -u _base_GHCziInt_I64zh_static_info -u _base_GHCziWord_W8zh_static_info -u _base_GHCziWord_W16zh_static_info -u _base_GHCziWord_W32zh_static_info -u _base_GHCziWord_W64zh_static_info -u _base_GHCziStable_StablePtr_static_info -u _ghczmprim_GHCziTypes_Izh_con_info -u _ghczmprim_GHCziTypes_Czh_con_info -u _ghczmprim_GHCziTypes_Fzh_con_info -u _ghczmprim_GHCziTypes_Dzh_con_info -u _base_GHCziPtr_Ptr_con_info -u _base_GHCziPtr_FunPtr_con_info -u _base_GHCziStable_StablePtr_con_info -u _ghczmprim_GHCziBool_False_closure -u _ghczmprim_GHCziBool_True_closure -u _base_GHCziPack_unpackCString_closure -u _base_GHCziIOBase_stackOverflow_closure -u _base_GHCziIOBase_heapOverflow_closure -u _base_ControlziExceptionziBase_nonTermination_closure -u _base_GHCziIOBase_blockedOnDeadMVar_closure -u _base_GHCziIOBase_blockedIndefinitely_closure -u _base_ControlziExceptionziBase_nestedAtomically_closure -u _base_GHCziWeak_runFinalizzerBatch_closure -u _base_GHCziTopHandler_runIO_closure -u _base_GHCziTopHandler_runNonIO_closure -u _base_GHCziConc_runHandlers_closure -u _base_GHCziConc_ensureIOManagerIsRunning_closure
Reading specs from C:/ghc/ghc-6.10.3/gcc-lib/specs
Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.5 (mingw-vista special r3)
C:/ghc/ghc-6.10.3/gcc-lib/collect2.exe -Bdynamic -o dlltest.exe -u _ghczmprim_GHCziTypes_Izh_static_info -u _ghczmprim_GHCziTypes_Czh_static_info -u _ghczmprim_GHCziTypes_Fzh_static_info -u _ghczmprim_GHCziTypes_Dzh_static_info -u _base_GHCziPtr_Ptr_static_info -u _base_GHCziWord_Wzh_static_info -u _base_GHCziInt_I8zh_static_info -u _base_GHCziInt_I16zh_static_info -u _base_GHCziInt_I32zh_static_info -u _base_GHCziInt_I64zh_static_info -u _base_GHCziWord_W8zh_static_info -u _base_GHCziWord_W16zh_static_info -u _base_GHCziWord_W32zh_static_info -u _base_GHCziWord_W64zh_static_info -u _base_GHCziStable_StablePtr_static_info -u _ghczmprim_GHCziTypes_Izh_con_info -u _ghczmprim_GHCziTypes_Czh_con_info -u _ghczmprim_GHCziTypes_Fzh_con_info -u _ghczmprim_GHCziTypes_Dzh_con_info -u _base_GHCziPtr_Ptr_con_info -u _base_GHCziPtr_FunPtr_con_info -u _base_GHCziStable_StablePtr_con_info -u _ghczmprim_GHCziBool_False_closure -u _ghczmprim_GHCziBool_True_closure -u _base_GHCziPack_unpackCString_closure -u _base_GHCziIOBase_stackOverflow_closure -u _base_GHCziIOBase_heapOverflow_closure -u _base_ControlziExceptionziBase_nonTermination_closure -u _base_GHCziIOBase_blockedOnDeadMVar_closure -u _base_GHCziIOBase_blockedIndefinitely_closure -u _base_ControlziExceptionziBase_nestedAtomically_closure -u _base_GHCziWeak_runFinalizzerBatch_closure -u _base_GHCziTopHandler_runIO_closure -u _base_GHCziTopHandler_runNonIO_closure -u _base_GHCziConc_runHandlers_closure -u _base_GHCziConc_ensureIOManagerIsRunning_closure C:/ghc/ghc-6.10.3/gcc-lib/crt2.o C:/ghc/ghc-6.10.3/gcc-lib/crtbegin.o -LC:\ghc\ghc-6.10.3\base-4.1.0.0 -LC:\ghc\ghc-6.10.3\integer-0.1.0.1 -LC:\ghc\ghc-6.10.3\ghc-prim-0.1.0.0 -LC:\ghc\ghc-6.10.3 -LC:\ghc\ghc-6.10.3/gcc-lib -LC:/ghc/ghc-6.10.3/gcc-lib dlltest.o -lhw-driver C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.o -lHSbase-4.1.0.0 -lwsock32 -lmsvcrt -lkernel32 -luser32 -lshell32 -lHSinteger-0.1.0.1 -lHSghc-prim-0.1.0.0 -lHSrts -lm -lffi -lgmp -lwsock32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt C:/ghc/ghc-6.10.3/gcc-lib/crtend.o
C:\ghc\ghc-6.10.3\gcc-lib\ld.exe: cannot find -lhw-driver
collect2: ld returned 1 exit status
*** Deleting temp files:
Deleting: C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.o C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0/ghc4428_0.rc
*** Deleting temp dirs:
Deleting: C:\DOCUME~1\CHRISC~1\LOCALS~1\Temp\/ghc4428_0
foreign import
stdcall
我认为在 Visual Studio 2003 中构建的 DLL 是正确的。我必须下载
pexports
MinGW 的工具,它列出了从 DLL 导出的函数。链接器一直在寻找 HWInit@0,但是
pexports
说 DLL 只导出 HWInit。
foreign import
ccall
相反,我成功地能够使用
ghc --make dlltest.hs hw-driver.lib
中的任何一个链接程序或
ghc --make dlltest.hs -L. -lhw-driver
由于在工作目录中同时存在 .lib 和 .dll 文件。
最佳答案
FFI spec # 4.1.1 Import Declarations ,
impent → " [
static
] [chname] [&] [cid] "
| "dynamic
"
| "wrapper
"
A C header specified in an import declaration is always included by
#include "
chname"
. There is no explicit support for#include <
chname>
style inclusion. The ISO C99 [3] standard guarantees that any search path that would be used for a#include <
chname>
is also used for#include "
chname"
and it is guaranteed that these paths are searched after all paths that are unique to#include "
chname"
. Furthermore, we require that chname ends on.h
to make parsing of the specification of external entities unambiguous.
foreign import stdcall "hw-driver.h HW_Init" hwInit :: IO CInt
foreign import stdcall "HW_Init" hwInit :: IO CInt
.
作为库搜索路径。这很可能是问题所在。 GHCI 神奇地包含
.
在库搜索路径中。
.lib
,这是一个静态库,请尝试通知链接器您想要静态链接。
stdcall
的任何东西上尝试过它。 s。
foreign
没那么麻烦手动的东西,如果只有 25 个电话左右。我设法手动将绑定(bind)写入
libvlc
几年前,为了一些小项目......
关于dll - DLL函数上的Haskell外部导入stdcall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1027246/
据我所知,只有 caller-clean-stack 约定可以使用变量参数。 顺便说一句,WinApi StringCchPrintfW 是这样声明的。(我删除了 SAL) __inline HRES
现在我正在设计一个函数f(index,...),它将调用函数数组中的#index条目并传递其余参数。如果您将函数数组视为服务列表,那么 f 的作用就像一个服务分发器。 f 是用汇编语言编写的。它弹出第
我对此很好奇: 当我从使用stdcall调用约定导出的动态链接库导入函数时,是否必须在external之前添加stdcall Delphi 从版本 7 开始? 即 LIBNAME int __stdc
在我的库中,我在特定条件下调用方法,这需要 stdcall 调用约定。目前,我正在使用编译器静态解析,将其实现为相当大的众所周知的方法签名列表和子例程的相应重载版本。这可行,但看起来很丑陋,并且没有
使用 D 内联汇编尝试实现动态调用 stdcall 函数(使用动态参数) 我有以下程序集args 是一个指向 32 位整数数组的 void 指针 argc 是参数计数的数量 ret 是一个 void
我正在将代码从 C++ 转换为我的 VB.NET 应用程序。这是 C++ 代码: typedef int (__stdcall *init_t)(uint32_t value,uint32_t pa
我正在编写一些使用 jni 的代码。我的目标平台是 Windows。所以我的 jni 函数必须使用 stdcall 调用约定,但 Rust 仅使用 cdecl 调用约定导出函数。 我使用 MinGW(
我无法将 stdcall 函数名称“TestFunction”作为参数传递给 ExecuteLocalThread 并在 beginthreadex 中使用 unsigned __stdcall Te
我正在使用 GCC 处理我自己的内核,当从 asm 代码调用 C 函数时,我必须做 add esp,xx我自己。经过一番搜索,我发现 stdcall是微软的发明,不能在 GCC 中使用。有什么方便的方
我目前正在尝试移植旧的 owl-c++-builder-projekt 以使用 XE2 和 owlnext。在旧文件中,我可以简单地调用一行 (FARPROC)LP_I2COpen = GetProc
我正在尝试使用具有回调机制的 (C) 第三方库,该机制缺少任何可能的识别调用上下文的方法。我的主要项目在 C# 中,我的包装器是一个调用 C 库 API 的 C++/CLI 项目。 为了解决这个问题,
有人可以给我一些为 MS winapi 函数创建函数指针的技巧吗?我正在尝试为 DefWindowProc (DefWindowProcA/DefWindowProcW) 创建指针,但出现此错误: L
我有简单的代码。 StdCall 是 __stdcall 而 CdeclCall 是 __cdecl。 #include int __stdcall StdCall(int a,int b) {
我有一个指向 COM 接口(interface)的指针,想从它的虚拟表中获取函数指针并进行方法调用。为此,我需要进行 stdcall 方法调用。在 Go 中如何使用约定 stdcall 进行调用或在
我制作了一个 DLL,它导出多个函数(使用 stdcall)。我想让其中一些接受或不接受参数。所以懒惰的程序员可以直接调用它而不需要任何参数。我在论坛上的某个地方读到默认参数在 DLL-s 中不起作用
我正在设计一个必须至少在 mingw 和 msvc++ 之间二进制兼容的 API。到目前为止,我限制自己使用接受和返回原始数据类型的函数或指向具有统一成员的 POD 结构的指针(即,成员都是同一类型,
在 Windows 下构建 DLL 时,我得到以下输出: Linking main.exe ... Warning: resolving _findPeaksWrapper by linking to
这个问题已经有答案了: Is there any equivalent for stdcall in GCC? (1 个回答) Is there STDCALL in Linux? (3 个回答) 已
我试图通过创建指定我需要使用的函数的 .def 文件,将函数从非托管 DLL 导入到 C 项目中。我正在练习 user32.dll 中的 WinAPI 函数 MessageBoxA。与其他 WinAP
我需要创建一个 C++ dll,它将通过 stdcall 从另一个程序调用。 需要什么:调用程序将字符串数组传递给 dll,dll 应该更改数组中的字符串值。然后,调用程序将继续使用来自 dll 的这
我是一名优秀的程序员,十分优秀!