Win32API 结构中 cbSize 成员的用途是什么?
What is the purpose of the cbSize member in Win32API structs
我经常遇到一些具有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 通常只返回失败的结果,而不是尝试处理看似损坏的数据。
部分版本控制,主要是安全性...以防止被调用的函数戳入不属于传入结构的内存。
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 删除类成员的动态分配内存的最佳方法是什么
- 初始化类成员的更好做法是什么?
- 键入擦除成员函数指针的"right"方法是什么?
- 使用只有一个成员的工会的目的是什么?
- 什么是指向成员模板参数的指针
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 命名空间 Win 没有成员"simpleControl"是什么意思
- 在多个对象中初始化预定义成员变量的正确方法是什么?
- 在不编写显式 setter 的情况下修改私有类数据成员的便捷方法是什么?模板有用吗?
- 这个星号 (*) 符号在 C++ 中是什么意思?-- 指向成员的指针
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 返回没有 typedef 的成员函数指针的语法是什么?
- 使用静态类成员而不是私有字段之间的速度差异是什么?
- 使用泛型成员变量"placement new"结构/类数组的正确方法是什么?
- 从C++与 C 灵活阵列成员互操作的正确方法是什么?
- 删除数组成员的更好方法是什么?