微软在版本兼容处置中的小技巧

微软在版本兼容处理中的小技巧
函数名:GlobalMemoryStatus

作用: 用来取得当前内存状态的动态信息(来自《window核心编程》);

参数: LPMEMORYSTATUS lpBuffer

typedef struct _MEMORYSTATUS { 
  DWORD dwLength; 
  DWORD dwMemoryLoad; 
  SIZE_T dwTotalPhys; 
  SIZE_T dwAvailPhys; 
  SIZE_T dwTotalPageFile; 
  SIZE_T dwAvailPageFile; 
  SIZE_T dwTotalVirtual; 
  SIZE_T dwAvailVirtual; 
} MEMORYSTATUS, *LPMEMORYSTATUS;

其中关于dwLength字段介绍时 MSDN介绍如下:
dwLength 
Size of the MEMORYSTATUS data structure, in bytes. You do not need to set this member before calling the GlobalMemoryStatus function; the function sets it. 

《window核心编程》介绍如下:
在调用GlobalMemoryStatus函数之前,我们必须初始化dwLength成员,将其设为MEMORYSTATUS结构的大小----即结构所占的字节数,这样的初始化使Microsoft能在今后版本的windows中给该结构添加更多的成员,而不必担心会破坏已有的应用程序。。。

请问为何初始化dwLength成员后以后向该结构添加更多的成员而不必担心破坏已有的程序?

纯讨论,各抒己见;


------解决方案--------------------
我觉得应该是这样:
比如现在MEMORYSTATUS的大小为x,你编译了一个程序,GlobalMemoryStatus通过dwLength的值为x知道MEMORYSTATUS的版本为有8个参数的版本。
你在现在的操作系统上运行你编译的程序,没有问题,一切正常。
但是,如果下一版本的操作系统,MEMORYSTATUS多了一个参数(SIZE_T dwTest),MEMORYSTATUS的大小也变为了y,调用GlobalMemoryStatus的时候,GlobalMemoryStatus如何知道该不该设置dwTest的值呢?
如果设置的话,你之前编译的程序就可能崩溃,因为之前的程序没有dwTest这个参数,设置这个参数就导致内存非法访问。
如果不设置的话也不实现,dwTest这个参数加上也没有意义了。
但是,你之前编译的程序传了一个参数x,GlobalMemoryStatus就也知道不应该设置dwTest,而你之后编译的版本,调用GlobalMemoryStatus时传的是y,GlobalMemoryStatus也就知道应该设置这个值了。