参数从 C# 代码错误地传递到 C++ DLL

发布于 2024-12-02 19:54:31 字数 552 浏览 1 评论 0原文

我使用以下 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

握住我的手 2024-12-09 19:54:31

您没有显示 C++ 代码,因此我没有看到您代码中的问题。所以,我尝试自己重新创建它。我创建了一个调用 DLL 的 C# WPF 项目。

C#:

        [DllImport(@"c:\users\owner\documents\visual studio 2010\Projects\MyDll\Release\MyDll.dll",
            CallingConvention = CallingConvention.Cdecl)]
        private static extern UInt64 someFunc(int arga, int argb, int argc); 

        private void DoIt_Click(object sender, RoutedEventArgs e)
        {
            UInt64 val = someFunc(0, 0, 1);
            ResultLabel.Content = val.ToString();
        }

C++ DLL:

extern "C" __declspec(dllexport) unsigned __int64 someFunc(int arga, int argb, int argc)
{
    CString s;
    s.Format(L"%d\t%d\t%d", arga, argb, argc);
    AfxMessageBox(s);
    return arga + argb + argc;
}

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#:

        [DllImport(@"c:\users\owner\documents\visual studio 2010\Projects\MyDll\Release\MyDll.dll",
            CallingConvention = CallingConvention.Cdecl)]
        private static extern UInt64 someFunc(int arga, int argb, int argc); 

        private void DoIt_Click(object sender, RoutedEventArgs e)
        {
            UInt64 val = someFunc(0, 0, 1);
            ResultLabel.Content = val.ToString();
        }

C++ DLL:

extern "C" __declspec(dllexport) unsigned __int64 someFunc(int arga, int argb, int argc)
{
    CString s;
    s.Format(L"%d\t%d\t%d", arga, argb, argc);
    AfxMessageBox(s);
    return arga + argb + argc;
}

The message box from C++ shows 0 0 1 as expected and the C# code gets 1 returned as expected.

极致的悲 2024-12-09 19:54:31

如果可以的话,请使用 __stdcall 而不是 __cdecl,__stdcall 中是执行堆栈清理的 C DLL,并且是使用 Windows C dll 的标准方式。

在 C 代码中指定调用约定也是一种很好的行为,既是为了可读性,也是因为 C++ 项目设置可以指定默认使用的调用约定。

尝试显式设置它 __cdecl,也许 c++ 编译器正在使用 __stdcall 编译它。

extern "C" __declspec(dllexport) UINT64 __cdecl someFunc(int arga, int argb, int argc);

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.

extern "C" __declspec(dllexport) UINT64 __cdecl someFunc(int arga, int argb, int argc);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文