微软在版本兼容处置中的小技巧
微软在版本兼容处理中的小技巧
函数名: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也就知道应该设置这个值了。
函数名: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也就知道应该设置这个值了。