__stdcall

阅读数:102 评论数:0

跳转到新版页面

分类

C/C++

正文

一、__stdcall

__stdcall 是微软 Windows 平台上常用的一种调用约定,特别是在 Win32 API 中广泛使用。它具有以下特点:

  1. 参数顺序:参数从右到左推入堆栈。
  2. 堆栈清理:被调用函数负责清理堆栈。
  3. 名称修饰:函数名在链接时会被修饰为 _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 并解析函数地址,而不依赖于编译时的符号解析。 通