Pinvoke upon return of int, API

本文关键字:API int of upon return Pinvoke | 更新日期: 2023-09-27 18:33:36


我目前遇到了从 C# Windows 应用程序调用 Win32 DLL[本机] 的问题。

我已经走了这么远。

C++来源:

extern "C" __declspec(dllexport) int PlaceSound(__in DWORD frequence, __in DWORD duration)
{
    Beep(frequence, duration);
    return 0;
}

C# 源代码:

[DllImport("SampleLib.dll")]
    public extern static int PlaceSound(int Freq, int Dura);
 public form1 { InitializeComponements; PlaceSound(150, 500); }

调试后,我收到声音,但是,当库返回其整数值时,我似乎得到了一个 pinvoke。

平唤:
调用 PInvoke 函数 'SoundTracer!SoundTracer.Form1::P laceSound' 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

我做错了什么?

Pinvoke upon return of int, API

C++编译器的默认调用约定是cdecl,但 p/invoke 的默认调用约定是 stdcall 。这种不匹配是您看到消息的原因。

此外,要 100% 正确,DWORD 是一个无符号整数,应与 uint 匹配。

所以你需要像这样导入它:

[DllImport("SampleLib.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static int PlaceSound(uint Freq, uint Dura);

好吧,PInovke通常默认为__stdcall/WINAPI/CALLBACK/PASCAL调用约定。修改C++源,使函数是 WINAPI,或者可能有办法修改 PInvoke 声明的函数以使用 cdecl 调用方法。 我只是总是为了方便

extern "C" __declspec(dllexport) int WINAPI PlaceSound(__in DWORD frequence, __in DWORD duration)
{
    Beep(frequence, duration);
    return 0;
}