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 签名的调用约定和参数是否与目标非托管签名匹配。
我做错了什么?
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;
}