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

时间:2008-10-09 23:48:51

标签: c++ winapi api

我经常遇到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的预期值。或者检查是否对结构进行了正确的包装。但是我想来你这里。

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

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:11)

  

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

这是一个原因。我认为这是比较常见的。

另一种是具有可变长度数据的结构。

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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