__stdcall
阅读数:102 评论数:0
跳转到新版页面分类
C/C++
正文
一、__stdcall
__stdcall
是微软 Windows 平台上常用的一种调用约定,特别是在 Win32 API 中广泛使用。它具有以下特点:
- 参数顺序:参数从右到左推入堆栈。
- 堆栈清理:被调用函数负责清理堆栈。
- 名称修饰:函数名在链接时会被修饰为
_name@N
,其中name
是函数名,N
是参数的总字节数。
二、使用
1、声明函数
当声明一个使用 __stdcall
调用约定的函数时,可以在函数声明中使用 __stdcall
关键字:
int __stdcall MyFunction(int a, float b);
2、定义函数
在函数定义中,同样需要使用 __stdcall
关键字:
int __stdcall MyFunction(int a, float b) {
// 函数实现
return 0;
}
3、示例
假设你有一个 DLL 项目,其中包含一个使用 __stdcall
调用约定的函数,以下是一个完整的示例:
(1)头文件(mylib.h)
#pragma once
#ifdef _WIN32
#ifdef BUILDING_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#else
#define DLL_EXPORT
#endif
#ifdef __cplusplus
extern "C" {
#endif
DLL_EXPORT int __stdcall MyFunction(int a, float b);
#ifdef __cplusplus
}
#endif
(2)实现文件(mylib.cpp)
#define BUILDING_DLL
#include "mylib.h"
int __stdcall MyFunction(int a, float b) {
// 函数实现
return a + static_cast<int>(b);
}
(3)使用DLL代码
#include "mylib.h"
#include <iostream>
int main() {
int result = MyFunction(3, 4.5f);
std::cout << "Result: " << result << std::endl;
return 0;
}
- 兼容性:
__stdcall
调用约定在 Windows 平台上使用广泛,但在跨平台项目中可能需要注意兼容性问题。 - 名称修饰:在链接阶段,由于
__stdcall
会对函数名进行修饰,因此在使用extern "C"
时需要特别注意名称修饰问题,以避免链接错误。
相关推荐
修饰变量的声明
例如:
若a.c中需要用b.c中的变量 int v,可以在a.c中声明extern int v,然后就可以引用变量v。能够被其他模块extern引用到的变量通常是全局变量。
还有一点是
一、h头文件
头文件是编译时必须的,声明函数接口。
通常包含函数声明、宏定义、数据类型定义和其他预处理指令。头文件的主要作用是提供函数和变量的声明,使得在不同的源文件中可以引用这些函数和变量。
在使用
一、概述
在 Windows 上创建和使用 DLL 时,__declspec(dllexport) 和 __declspec(dllimport) 是两个非常重要的关键字,它们用于控制函数和变量的导出
一、概述
在 Qt 项目中使用 WORD 和 DWORD 类型时,需要注意这些类型是 Windows 平台上定义的数据类型,通常用于 Windows API 编程。它们分别表示 16 位和 32 位无
JNI 调用 DLL
动态加载:JNI 使用 System.loadLibrary() 或 System.load() 方法来动态加载 DLL。这个过程不需要链接时的静态库(.lib 文件),因为
一、概述
使用 QLibrary 动态加载 DLL 时,不需要在项目中链接对应的 .lib 文件。这是因为 QLibrary 直接在运行时加载 DLL 并解析函数地址,而不依赖于编译时的符号解析。
通