Win32API 结构中 cbSize 成员的用途是啥
Posted
技术标签:
【中文标题】Win32API 结构中 cbSize 成员的用途是啥【英文标题】:What is the purpose of the cbSize member in Win32API structsWin32API 结构中 cbSize 成员的用途是什么 【发布时间】:2008-10-09 23:48:51 【问题描述】:我经常遇到一些 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
成员的用途是什么?
【问题讨论】:
【参考方案1】:它用于版本控制。一个很好的例子是GetVersionEx 电话。您可以传入OSVERSIONINFO 或OSVERSIONINFOEX。 OSVERSIONINFOEX 是 OSVERSIONINFO 的超集,操作系统知道您传入的唯一方法是通过 dwOSVersionInfoSize 成员。
【讨论】:
Stuts 的大小也因操作系统版本而异。我刚刚在使用 VC++ 2008 附带的平台 sdk 时遇到了一个错误。我们没有正确定义操作系统版本,最终使用了 Vista 版本的结构 - 这在我的 XP 机器上效果不佳。【参考方案2】:我最初的猜测是这可能 可能用于版本控制。
这是一个原因。我认为这是更常见的一种。
另一个是用于具有可变长度数据的结构。
我不认为检查调用者中的正确打包或错误是其背后的特殊原因,但它会产生这种效果。
【讨论】:
【参考方案3】:它还允许 WIN32 API 对传入的数据进行最少量的完整性检查。
例如,一个常见的错误是 WIN32 结构以 incorrect 或 uninitialised cbSize 传入> 当这种情况发生时,WIN32 API 通常只返回一个失败的结果,而不是尝试处理看似损坏的数据。
【讨论】:
【参考方案4】:部分版本控制,主要是安全性...以防止被调用的函数插入不属于传入结构的内存。
【讨论】:
以上是关于Win32API 结构中 cbSize 成员的用途是啥的主要内容,如果未能解决你的问题,请参考以下文章
OVERLAPPED Win32 结构中的 hEvent 成员