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 结构以 incorrectuninitialised cbSize 传入> 当这种情况发生时,WIN32 API 通常只返回一个失败的结果,而不是尝试处理看似损坏的数据。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Win32API 结构中 cbSize 成员的用途是啥的主要内容,如果未能解决你的问题,请参考以下文章

win32框架

OVERLAPPED Win32 结构中的 hEvent 成员

WIN32是啥啊

汇编中的win32 api帮助

Win32 ReadProcessMemory API 的问题

如何使用 win32 api 获取域用户帐户列表?