我需要从C_调用外部dll。这是标题定义:

enum WatchMode {
   WATCH_MODE_SYSTEM = 0,
   WATCH_MODE_APPLICATION  = 1 };

LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode );

我在c中添加了枚举和调用:
public enum WatchMode
{
    WATCH_MODE_SYSTEM = 0,
    WATCH_MODE_APPLICATION = 1
}
[DllImport("AdsWatchdog.dll")]
internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode);

这将生成AccessViolationException。我知道dll正在“工作”,因为我还添加了对GetHandle的调用,该调用将返回上面提到的hHandle。我试图将参数更改为intref int watchmode),但得到了相同的错误。有人知道我怎么才能接上电话吗?

最佳答案

您遇到了C和C++之间的参数大小问题。在C++/Windows世界中,长是一个4字节有符号整数。在c world long中是一个8字节有符号整数。你应该把你的签名改成内号。
ffpf说你应该在这里使用intptr是错误的。它将在32位计算机上解决此特定问题,因为intptr将封送为int。如果在64位计算机上运行此命令,它将再次封送为8字节有符号整数,并将崩溃。

关于c# - 正确使用P/调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/148856/

10-08 22:50