c - 如何以 user32.dll(又名 stdcall?)方式声明 DLL?

标签 c windows winapi dll compiler-construction

我有一个第三方应用程序,允许您从 DLL 文件调用 C 函数。此应用程序提供的示例显示您可以从 user32.dll 调用 MessageBoxW。它还允许您从 DLL 文件中调用 C 函数。

我从 file.h 文件中创建了一个 DLL,如下所示:

_declspec (dllexport) void example(int);

和 file.c 是这样的:

#include <stdio.h>
#include "file.h"

_declspec (dllexport) void example(int s1)
{
    printf("dsa");    
}

然后使用 Windows SDK 中的 C/C++ 编译器版本 15 编译它,如下所示:

cl file.c /DLL /LD

并且我使用 DLL 文件进行了正确的编译。在 DLL 函数检查器中,我看到了我的函数。我将这个文件放到 System32 文件夹中,然后从这个第三方应用程序中调用它。

应用程序找到文件,但找不到函数。

我认为问题的原因是我以 Windows 库(如 user32.dll)的其他方式/方式/标准声明(或编译)我的 DLL,因为 user32.dll 工作正常。

我发现第三方应用程序在DLL中使用了这种调用函数:

winapi_abi Used for calling Windows system functions. These are declared as stdcall on Windows, but do not have mangled names.

所以我的问题是:如何以 user32.dll 方式(stdcall?)准备和编译 DLL 文件,以便它可以与第三方应用程序一起使用?

最佳答案

简单的答案是:

__declspec(dllexport) void __stdcall example(int);

当然,在实现方面也是如此。

如果你查看 windows.h 和 friend 你会看到:

#define WINUSERAPI __declspec(dllexport)
#define WINAPI __stdcall

然后:

WINUSERAPI int WINAPI MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT);

但是如果你只是定义了一些函数,那么就不需要宏了。

关于c - 如何以 user32.dll(又名 stdcall?)方式声明 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654972/

相关文章:

c - 如何在 Visual Studios 中使用 CreateProcess 函数

c - 检索库运行时

无法从字符串数组中正确读取

c++ - 如何确定我在无线网络中连接的接入点的延迟和数据包丢失?

c++ - LPPICTURE 在哪里定义的?

Windows 设备坐标与虚拟坐标

在 c 或 obj-c 中将 int 转换为十六进制字符串

python - Autokeras 与 Anaconda 的安装

winapi - 如何在Windows编辑控件上下文菜单中禁用复制/粘贴命令?

c++ - postThreadMessage/peekmessage 的替代方案?