declspec and stdcall vs declspec only
declspec and stdcall vs declspec only
我是C++dll导入主题的新人,可能是我的问题很容易,但我在谷歌上找不到它。
我有一个非常简单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(类型__stdcall,什么时候我只能使用__declspec(dllexport(类型?
多谢。
这样想:
__declspec(dllexport)
将函数声明为 DLL 导出的公共函数;__stdcall
是一个相当低级的细节,指的是该函数采用的"调用约定";具体来说,__stdcall
意味着被调用方清理堆栈;__stdcall
的替代方法是__cdecl
,这意味着:调用者清理堆栈。
__cdecl
是"自然的"C 调用约定;它支持 vararg 函数(如 printf(的定义。
__stdcall
是 DLL 函数的默认调用约定,因此,如果您只打算通过其 DLL API 调用这些函数,则无需指定它。
这应该解释你正在观察什么。
它偶然工作,因为该函数不接受任何参数。 一旦你在一个接受参数的函数上这样做,你就会开始失去运气。 调用将使堆栈不平衡,非常不健康。 调试时,您会收到 pInvokeStackImbalance MDA 警告。 否则,不平衡的堆栈可能会在一段时间内被忽视,它往往会在发布版本中使程序崩溃。
如果使用其他约定编译调用代码,则需要指定调用约定。否则,默认值将起作用。
Ilya,您还可以在项目属性 -> 配置属性 -> C/C++ -> 高级 -> 调用约定中设置默认调用约定。如果项目中的默认调用约定已设置为 __stdcall (/Gz(,则添加__std
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- 如何理解"abstract-declarator containing an ellipsis shall only be used in a parameter-declaration"
- 开发QR扫描仪以扫描我生成的"only" QR码?
- C ++:DECLSPEC,静态库和DLL
- Protobuf 生成的C++类无法针对 iOS 进行编译,并显示错误"Only virtual member functions can be marked 'final'"
- Windows 10 环境中的"This version of XAudio2 is available only in Windows 8"错误
- CUDA 内核"Only a single pack parameter is allowed"解决方法?
- 为什么仅 -fno-signed-0 就可以实现优化,而似乎也需要 -ffinite-math-only (gcc)
- 在 c++11 模式下使用 QtConcurrent::run with move only 参数
- 为什么这句话"The expression can be used only as the left-hand operand of a member function call"在 [expr.re
- 平息海湾合作委员会的"only available with -std=c++XX or -std=gnu++XX"警告
- 为什么 std::optional 不允许"move construct and copy assign only"类型的移动分配?
- "useinbandfec is a unidirectional receive-only parameter"作品中是什么意思?
- 犰狳/ Xcode:无处"functions that differ only in their return type cannot be overloaded"错误
- SDL_LoadBMP only returning NULL
- OpenCV SVM 在火车上抛出异常,"Bad argument (There is only a single class)"
- "Only non-static member functions may be virtual"
- 分配给数组成员时在 Clang 中"Read-only variable is not assignable"
- declspec and stdcall vs declspec only