Win32API结构体中的cbSize成员有什么作用?

10

我经常遇到一些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编译时预期值相同,或者检查结构体是否进行了适当的打包。但我想听听你的想法。

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

4个回答

13

它被用于版本控制。一个很好的例子是GetVersionEx调用。你可以传入OSVERSIONINFO或者OSVERSIONINFOEX,其中OSVERSIONINFOEX是OSVERSIONINFO的超集,操作系统只能通过dwOSVersionInfoSize成员来判断你传入的是哪个结构体。


1
结构体在不同的操作系统版本中大小也会有所不同。我刚刚在使用VC++ 2008附带的平台SDK时遇到了一个错误。我们没有正确定义操作系统版本,结果使用了Vista版本的结构体,在我的XP电脑上效果不太好。 - Aardvark

11

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

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

另一个原因是针对具有可变长度数据的结构。

我不认为检查调用者是否正确打包或存在错误是其特定推理的原因,但它确实会产生这种效果。


3
它还允许 WIN32 API 对传入的数据进行最少量的合理性检查。
例如,常见的错误是将带有不正确或未初始化的 cbSizeWIN32 结构体传递进来,当这种情况发生时,WIN32 API 通常只会返回一个失败的结果,而不是尝试处理似乎已被破坏的数据。

1

部分版本控制,主要是为了安全...以防止被调用的函数访问未包含在传入结构体中的内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接