9

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

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

然后我们像这样使用它:

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

或者

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

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

cbSizeWin32API 上某些 C++ 结构中成员的用途是什么?

4

4 回答 4

12

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

于 2008-10-10T00:12:55.257 回答
11

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

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

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

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

于 2008-10-09T23:51:26.437 回答
3

它还允许WIN32 API对传入的数据进行最少量的完整性检查。

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

于 2008-10-10T00:43:51.137 回答
1

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

于 2008-10-09T23:56:44.993 回答