Esto es para compatibilidad con versiones anteriores cuando se extiende la API de Windows.
Imagine las siguientes declaraciones
struct WinData
{
long flags;
}
BOOL GetWinData(WinData * wd);
que realiza la llamada como esto:
WinData wd;
GetWinData(&wd);
Una versión futura del sistema operativo puede extender esto a
struct WinData
{
long flags;
long extraData;
}
Sin embargo, si ha compilado en contra del SDK "anterior", GetWinData
no tiene ninguna posibilidad de descubrir que usted no sabe aproximadamente extraData
. Si lo llenase independientemente, sobrescribiría los datos en la pila. ¡BOOOM!
Por eso, el "tamaño conocido por la persona que llama" se agrega a la estructura y los miembros nuevos se anexan al final. La implementación de GetWinData
puede inspeccionar el tamaño y decidir "este pobre tipo aún no conoce todas las características nuevas".
+1 Debe haber un sitio web dedicado a las razones por las que las personas piensan que Windows es una mierda, junto con explicaciones racionales y sensatas (como esta) sobre por qué algo se hace de cierta manera. También es interesante cómo la compatibilidad con versiones anteriores es a menudo la explicación de algo extraño en Windows. Utilizo esto para silenciar a los fanboys de Mac a veces, recordándoles cómo todo el software deja de funcionar con cada nuevo sistema operativo. – MusiGenesis
A veces usan el tamaño o la variable de versión, a veces van a somestructEx para indicar extra o extendido. –
@MusiGenesis: creo que hay un sitio web de este tipo y se llama [Raymond Chen's Blog] (http://blogs.msdn.com/b/oldnewthing/). :-) –