📜  在函数中写WINAPI字的目的是什么 (1)

📅  最后修改于: 2023-12-03 14:51:24.352000             🧑  作者: Mango

在函数中写WINAPI字的目的是什么

当我们在编写 Windows 平台下的应用程序时,我们会经常看到一些函数声明中带有 WINAPI 字样。那么,这个 WINAPI 到底是什么意思,为什么需要写在函数中呢?

什么是 WINAPI

WINAPI 实际上是一个宏定义,它等价于 __stdcall__stdcall 是一种调用约定,也叫做函数名修饰。调用函数时,编译器需要知道函数是如何被调用的,这个信息就被存储在函数名中。stdcall 表示参数传递按从右到左的顺序压入栈中,并由被调用函数负责弹出栈,同时在调用结束后由被调用函数返回结果。

为什么要写 WINAPI

在 Windows 平台下,我们编写的应用程序需要和操作系统进行交互。而 Windows 操作系统提供了很多 API 函数供我们调用。这些函数都有自己的调用约定,也就是它们的函数名中包含有 WINAPI 或者 __stdcall 等,告诉编译器如何调用这些函数。如果我们在使用这些 API 函数时不写上 WINAPI,那么编译器就会按照默认的调用约定来调用它们,这就会导致程序运行出现未知错误。

另外,我们在使用这些 API 函数时,还需要包含相应的头文件。这些头文件的定义中,也会用到一些 WINAPI 或者 __stdcall 等,以确保函数被正确地调用。如果我们没有正确引入相应的头文件,同样也会导致程序运行出现错误。

示例代码

下面是一个使用 WINAPI 的示例代码,它定义了一个名为 MyCallback 的回调函数:

#include <windows.h>

DWORD WINAPI MyCallback(LPVOID lpParam) {
    // do something here
    return 0;
}

int main() {
    HANDLE hThread = CreateThread(NULL, 0, MyCallback, NULL, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    return 0;
}

在上面的代码中,我们使用了 Windows API 函数 CreateThread 来创建一个新线程,并将 MyCallback 函数作为回调函数传入。由于 MyCallback 函数在定义时使用了 WINAPI 关键字,因此编译器会按照 stdcall 调用约定来调用它。如果我们没有加上 WINAPI 关键字,编译器就会按照默认的调用约定来调用它,导致程序出错。

总结

WINAPI 是 Windows 平台下的一种调用约定,用于告诉编译器如何调用 API 函数。为了确保程序能够正确地调用这些 API 函数,我们需要在函数声明中使用 WINAPI 关键字。同时,我们还需要包含相应的头文件,以确保 API 函数被正确地定义。