我经常遇到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
成员的目的是什么?
答案 0 :(得分:12)
用于版本控制。一个很好的例子是GetVersionEx电话。您可以传递OSVERSIONINFO或OSVERSIONINFOEX。 OSVERSIONINFOEX是OSVERSIONINFO的超集,操作系统知道你传入的唯一方法是dwOSVersionInfoSize成员。
答案 1 :(得分:11)
我最初的猜测是,这可以 可能用于版本控制。
这是一个原因。我认为这是比较常见的。
另一种是具有可变长度数据的结构。
我不认为在调用者中检查正确的打包或错误是其背后的特殊原因,但它会产生这种效果。
答案 2 :(得分:3)
它还允许 WIN32 API 对传入的数据进行最少量的完整性检查。
例如,一个常见的错误是 WIN32 结构传入不正确或未初始化 cbSize 当发生这种情况时, WIN32 API 通常只返回失败的结果,而不是尝试处理看似已损坏的数据。
答案 3 :(得分:1)
部分版本控制,主要是安全性...防止被调用的函数进入不是传入的结构的内存。