pet*_*hen 12
这是为了在扩展Windows API时实现向后兼容.
想象一下以下声明
struct WinData
{
long flags;
}
BOOL GetWinData(WinData * wd);
Run Code Online (Sandbox Code Playgroud)
你这样称呼的是:
WinData wd;
GetWinData(&wd);
Run Code Online (Sandbox Code Playgroud)
未来的操作系统版本可能会扩展到
struct WinData
{
long flags;
long extraData;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您已经针对"较旧"的SDK编译,GetWinData则没有机会弄清楚您不知道extraData.如果它会填写它,它会覆盖堆栈上的数据.BOOOM!
这就是为什么,"调用者已知的大小"被添加到结构中,并在末尾附加新成员.该GetWinData实施可以检查的大小和决定"这个可怜的家伙不知道所有的新功能呢."
这样可以在API的未来版本中扩展该结构,然后Windows可以知道(通过调用者传入的大小)应该查看哪些字段.它基本上是API版本的粗略形式.
通常这些计数字节以前缀为前缀cb,代表"字节数".例如,STARTUPINFO结构以:
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
...
} STARTUPINFO, *LPSTARTUPINFO;
Run Code Online (Sandbox Code Playgroud)
这在某种程度上延伸了STARTUPINFOEX结构,其中包含相同的第一部分但具有不同的尺寸.根据值cb,Windows将知道是否查看新lpAttributeList字段.