在XP系统上出现无法定位程序输入点 K32GetProcessMemoryInfo的解决方案
VC2012升级补丁5.0之后,编译出来的程序发现在XP系统无法定位程序输入点K32GetProcessMemoryInfo于动态链接库kernel32.dll之上。
之前程序一直在XP上安装正常,今天测试组的同事突然发现,新发布的版本不能在XP上使用,这个问题比较奇怪,因为以往的版本都是没有问题的。为什么会突然出现这个问题呢?一开始就去查找是否所有工程都使用V110_XP来编译,找完所有工程都没出错。最后才想到近来升级VC2012的Update5.0的补丁,再打包编译之后,才发现XP的电脑不能使用了。
经过查找分析,发现是如下问题:
这是由于GetProcessMemoryInfo在不同系统版本号不同导致的,官方说明如下:
Remarks
StartingwithWindows7andWindowsServer2008R2,Psapi.hestablishesversionnumbersforthePSAPIfunctions.ThePSAPIversionnumberaffectsthenameusedtocallthefunctionandthelibrarythataprogrammustload.
IfPSAPI_VERSIONis2orgreater,thisfunctionisdefinedasK32GetProcessMemoryInfoinPsapi.handexportedinKernel32.libandKernel32.dll.IfPSAPI_VERSIONis1,thisfunctionisdefinedasGetProcessMemoryInfoinPsapi.handexportedinPsapi.libandPsapi.dllasawrapperthatcallsK32GetProcessMemoryInfo.
ProgramsthatmustrunonearlierversionsofWindowsaswellasWindows7andlaterversionsshouldalwayscallthisfunctionasGetProcessMemoryInfo.Toensurecorrectresolutionofsymbols,addPsapi.libtotheTARGETLIBSmacroandcompiletheprogramwith-DPSAPI_VERSION=1.Touserun-timedynamiclinking,loadPsapi.dll.
解决方案如下:
只需要在#include<psapi.h>引用前添加
#ifndefPSAPI_VERSION #definePSAPI_VERSION1 #endif #include<psapi.h> #pragma comment(lib,"Psapi.lib")
看来微软已经不支持XP系统了,因此所有发布的新版本软件已经不再测试XP的兼容性了。看来明年,也需要转向不支持XP系统了,否则需要投入的测试成本和维护成本急剧上升中,需要全面转向WIN7和WIN10系统的支持。有此可见,生态系统就是这么重要的事情,可以左右大局。