Win32API结构中cbSize成员的用途是什么

Jor*_*ira 9 c++ api winapi

我经常遇到Win32API结构的一些定义(但不限于它),它们具有cbSize以下示例中的成员.

typedef struct _TEST {
    int cbSize;
    // other members follow
} TEST, *PTEST;
Run Code Online (Sandbox Code Playgroud)

然后我们像这样使用它:

TEST t = { sizeof(TEST) };
...
Run Code Online (Sandbox Code Playgroud)

要么

TEST t;
t.cbSize = sizeof(TEST);
...
Run Code Online (Sandbox Code Playgroud)

我最初的猜测是,这可能会用于版本控制.接收类似于此结构的指针的DLL可以检查该cbSize成员是否具有用于编译DLL的预期值.或者检查是否对结构进行了正确的包装.但是我想在这里.

cbSizeWin32API上某些C++结构中成员的目的是什么?

Rob*_*ker 12

它用于版本控制.一个很好的例子是GetVersionEx调用.您可以传入OSVERSIONINFOOSVERSIONINFOEX.OSVERSIONINFOEX是OSVERSIONINFO的超集,操作系统知道您传入的唯一方法是dwOSVersionInfoSize成员.


Mic*_*urr 11

我最初的猜测是,这可能会用于版本控制.

这是一个原因.我认为这是比较常见的一个.

另一种是具有可变长度数据的结构.

我不认为在调用者中检查正确的打包或错误是其背后的特殊原因,但它会产生这种效果.