参数从 C# 代码错误地传递到 C++ DLL
我使用以下 DllImport:
[DllImport(@"someDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern UINT64 someFunc(int arga, int argb, int argc);
我按如下方式调用该函数:
someFunc(0,0,1);
在 h 文件中我声明该函数:
extern "C" __declspec(dllexport) UINT64 someFunc(int arga, int argb, int argc);
cpp:
UINT64 someFunc(int arga, int argb, int argc)
{
...
}
在 C++ 代码中我收到奇怪的值(例如 1218628、20140292、1219020)。
知道为什么吗?
I use the following DllImport:
[DllImport(@"someDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern UINT64 someFunc(int arga, int argb, int argc);
I'm calling the function as follows:
someFunc(0,0,1);
In h file i declare the function:
extern "C" __declspec(dllexport) UINT64 someFunc(int arga, int argb, int argc);
cpp:
UINT64 someFunc(int arga, int argb, int argc)
{
...
}
In the C++ code I receive weird values (such as 1218628, 20140292, 1219020).
Any idea why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您没有显示 C++ 代码,因此我没有看到您代码中的问题。所以,我尝试自己重新创建它。我创建了一个调用 DLL 的 C# WPF 项目。
C#:
C++ DLL:
C++ 的消息框按预期显示 0 0 1,而 C# 代码按预期返回 1。
You didn't show the C++ code so I don't see the problem in your code. So, I tried recreating it myself. I created a C# WPF project which calls into a DLL.
C#:
C++ DLL:
The message box from C++ shows 0 0 1 as expected and the C# code gets 1 returned as expected.
如果可以的话,请使用 __stdcall 而不是 __cdecl,__stdcall 中是执行堆栈清理的 C DLL,并且是使用 Windows C dll 的标准方式。
在 C 代码中指定调用约定也是一种很好的行为,既是为了可读性,也是因为 C++ 项目设置可以指定默认使用的调用约定。
尝试显式设置它 __cdecl,也许 c++ 编译器正在使用 __stdcall 编译它。
Use __stdcall instead of __cdecl if you can, in __stdcall is the C DLL that performs stack cleanup and is the standard way windows C dlls are used.
It is also a good behaviour to specify the calling convention in your C code, both for readability and because C++ project settings can specify what calling convention use by default.
Try to set it __cdecl explicitly, maybe c++ compiler is compiling it using __stdcall.