gpt4 book ai didi

c# - 仅 declspec 和 stdcall 与 declspec

转载 作者:IT老高 更新时间:2023-10-28 22:35:30 29 4
gpt4 key购买 nike

我是 C++ dll 导入主题的新手,可能我的问题很简单,但我在 google 上找不到。

我有一个非常简单的 C++ win32 dll:

#include <iostream>

using namespace std;

extern "C"
{
__declspec(dllexport) void __stdcall DisplayHellowFromDLL()
{
cout<<"Hi"<<endl;
}
}

当我从 C# 调用此方法时,我没有任何问题,这里是 C# 代码

namespace UnmanagedTester
{
class Program
{
[DllImport(@"C:\CGlobalDll")]
public static extern void DisplayHellowFromDLL();

static void Main(string[] args)
{
Console.WriteLine("This is C# program");
DisplayHellowFromDLL();
}
}
}

正如我所料,输出是:“这是 C# 程序”“嗨”。

现在,如果我将 C 函数的声明更改为:

__declspec(dllexport) void DisplayHellowFromDLL()

没有__stdcall,我也没有任何问题,问题是:

什么时候我真的需要 __declspec(dllexport) TYPE __stdcall 什么时候我只能使用 __declspec(dllexport) TYPE ?

非常感谢。

最佳答案

你可以这样想:

  1. __declspec(dllexport) 将您的函数声明为您的 DLL 导出的公共(public)函数;

  2. __stdcall 是一个相当低级的细节,指的是该函数采用的“调用约定”;具体来说,__stdcall表示被调用者清理堆栈;

  3. __stdcall的替代品是__cdecl,意思是:调用者清理堆栈。

__cdecl 是“自然”的 C 调用约定;它支持可变参数函数的定义(如 printf)。

__stdcall 是 DLL 函数的默认调用约定,因此如果您只打算通过它们的 DLL API 调用这些函数,则不需要指定它。

这应该可以解释您所观察到的内容。

关于c# - 仅 declspec 和 stdcall 与 declspec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6334283/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com