Pinvoke upon return of int, API
Pinvoke upon return of int, API
我目前遇到了从 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;
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 用于访问容器<T>数据成员的正确 API
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++MySQL C api用户输入行
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 声明 Windows API 结构 (DCB) 的对象 - 错误 C4430:缺少类型说明符 - 假定为 int
- Pinvoke upon return of int, API
- c++int存储为char*转换中的字符,无需任何API
- 在win32 API中将int转换为string