- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 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 ?
非常感谢。
最佳答案
你可以这样想:
__declspec(dllexport)
将您的函数声明为您的 DLL 导出的公共(public)函数;
__stdcall
是一个相当低级的细节,指的是该函数采用的“调用约定”;具体来说,__stdcall
表示被调用者清理堆栈;
__stdcall
的替代品是__cdecl
,意思是:调用者清理堆栈。
__cdecl
是“自然”的 C 调用约定;它支持可变参数函数的定义(如 printf)。
__stdcall
是 DLL 函数的默认调用约定,因此如果您只打算通过它们的 DLL API 调用这些函数,则不需要指定它。
这应该可以解释您所观察到的内容。
关于c# - 仅 declspec 和 stdcall 与 declspec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6334283/
据我所知,只有 caller-clean-stack 约定可以使用变量参数。 顺便说一句,WinApi StringCchPrintfW 是这样声明的。(我删除了 SAL) __inline HRES
现在我正在设计一个函数f(index,...),它将调用函数数组中的#index条目并传递其余参数。如果您将函数数组视为服务列表,那么 f 的作用就像一个服务分发器。 f 是用汇编语言编写的。它弹出第
我对此很好奇: 当我从使用stdcall调用约定导出的动态链接库导入函数时,是否必须在external之前添加stdcall Delphi 从版本 7 开始? 即 LIBNAME int __stdc
在我的库中,我在特定条件下调用方法,这需要 stdcall 调用约定。目前,我正在使用编译器静态解析,将其实现为相当大的众所周知的方法签名列表和子例程的相应重载版本。这可行,但看起来很丑陋,并且没有
使用 D 内联汇编尝试实现动态调用 stdcall 函数(使用动态参数) 我有以下程序集args 是一个指向 32 位整数数组的 void 指针 argc 是参数计数的数量 ret 是一个 void
我正在将代码从 C++ 转换为我的 VB.NET 应用程序。这是 C++ 代码: typedef int (__stdcall *init_t)(uint32_t value,uint32_t pa
我正在编写一些使用 jni 的代码。我的目标平台是 Windows。所以我的 jni 函数必须使用 stdcall 调用约定,但 Rust 仅使用 cdecl 调用约定导出函数。 我使用 MinGW(
我无法将 stdcall 函数名称“TestFunction”作为参数传递给 ExecuteLocalThread 并在 beginthreadex 中使用 unsigned __stdcall Te
我正在使用 GCC 处理我自己的内核,当从 asm 代码调用 C 函数时,我必须做 add esp,xx我自己。经过一番搜索,我发现 stdcall是微软的发明,不能在 GCC 中使用。有什么方便的方
我目前正在尝试移植旧的 owl-c++-builder-projekt 以使用 XE2 和 owlnext。在旧文件中,我可以简单地调用一行 (FARPROC)LP_I2COpen = GetProc
我正在尝试使用具有回调机制的 (C) 第三方库,该机制缺少任何可能的识别调用上下文的方法。我的主要项目在 C# 中,我的包装器是一个调用 C 库 API 的 C++/CLI 项目。 为了解决这个问题,
有人可以给我一些为 MS winapi 函数创建函数指针的技巧吗?我正在尝试为 DefWindowProc (DefWindowProcA/DefWindowProcW) 创建指针,但出现此错误: L
我有简单的代码。 StdCall 是 __stdcall 而 CdeclCall 是 __cdecl。 #include int __stdcall StdCall(int a,int b) {
我有一个指向 COM 接口(interface)的指针,想从它的虚拟表中获取函数指针并进行方法调用。为此,我需要进行 stdcall 方法调用。在 Go 中如何使用约定 stdcall 进行调用或在
我制作了一个 DLL,它导出多个函数(使用 stdcall)。我想让其中一些接受或不接受参数。所以懒惰的程序员可以直接调用它而不需要任何参数。我在论坛上的某个地方读到默认参数在 DLL-s 中不起作用
我正在设计一个必须至少在 mingw 和 msvc++ 之间二进制兼容的 API。到目前为止,我限制自己使用接受和返回原始数据类型的函数或指向具有统一成员的 POD 结构的指针(即,成员都是同一类型,
在 Windows 下构建 DLL 时,我得到以下输出: Linking main.exe ... Warning: resolving _findPeaksWrapper by linking to
这个问题已经有答案了: Is there any equivalent for stdcall in GCC? (1 个回答) Is there STDCALL in Linux? (3 个回答) 已
我试图通过创建指定我需要使用的函数的 .def 文件,将函数从非托管 DLL 导入到 C 项目中。我正在练习 user32.dll 中的 WinAPI 函数 MessageBoxA。与其他 WinAP
我需要创建一个 C++ dll,它将通过 stdcall 从另一个程序调用。 需要什么:调用程序将字符串数组传递给 dll,dll 应该更改数组中的字符串值。然后,调用程序将继续使用来自 dll 的这
我是一名优秀的程序员,十分优秀!