Win32API 结构中 cbSize 成员的用途是什么?

What is the purpose of the cbSize member in Win32API structs

本文关键字:是什么 成员 结构 cbSize Win32API      更新时间:2023-10-16

我经常遇到一些具有cbSize成员的Win32API结构(但不限于它)的定义,如以下示例所示。

typedef struct _TEST {
    int cbSize;
    // other members follow
} TEST, *PTEST;

然后我们像这样使用它:

TEST t = { sizeof(TEST) };
...

TEST t;
t.cbSize = sizeof(TEST);
...

我最初的猜测是,这可能用于版本控制。接收此类结构的指针的 DLL 可以检查cbSize成员是否具有编译 DLL 时使用的预期值。或者检查结构是否进行了正确的包装。但我想从你这里。

Win32API 上某些C++结构中的cbSize成员的目的是什么?

它用于版本控制。 一个很好的例子是 GetVersionEx 调用。 您可以传入 OSVERSIONINFO 或 OSVERSIONINFOEX。 OSVERSIONINFOEX 是 OSVERSIONINFO 的超集,操作系统知道您传入的唯一方法是通过 dwOSVersionInfoSize 成员。

我最初的猜测是,这可能会 可能用于版本控制。

这是一个原因。 我认为这是更常见的一种。

另一个是用于具有可变长度数据的结构。

我不认为检查调用者中的正确打包或错误是其背后的特殊原因,但它会产生这种效果。

它还允许 WIN32 API 对传入的数据执行最少量的健全性检查。

例如,逗号错误是使用不正确未初始化cbSize 传入 WIN32 结构,发生这种情况时,WIN32 API 通常只返回失败的结果,而不是尝试处理看似损坏的数据。

部分版本控制,主要是安全性...以防止被调用的函数戳入不属于传入结构的内存。