返回int,API时Pinvoke

Ras*_*org 0 c# c++ api pinvoke


我目前遇到一个从C#windows应用程序调用Win32 DLL [Native]的问题.

我到目前为止.

C++源码:

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

C#来源:

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

 public form1 { InitializeComponements; PlaceSound(150, 500); }
Run Code Online (Sandbox Code Playgroud)

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

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

我究竟做错了什么?

Dav*_*nan 10

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

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

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

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