无法定位程序输入点K32EnumProcessModules于动态链接库KERNEL32.dll上

  • 2016-03-09
  • 2295℃
Share:

问题描述:

使用vs2013编译出来的程序,在xp下运行的时候出现如下错误:

无法定位程序输入点K32EnumProcessModules于动态链接库KERNEL32.dll上

如果当前使用的是VS2010编译器自带的 WinSDK v7.0,那么个别时候当执行程序时,会错误提示:

The procedure entry point K32*** could not be located in the dynamic link library KERNEL32.dll

中文版本的就是:无法定位程序输入点K32EnumProcessModules于动态链接库KERNEL32.dll上。这样的错误提示一般会出现在非 Windows7 或者 Windows Server 2008 R2 的系统上面。


解决方法:

因为一些性能的问题,在Windows7 和 Windows Server 2008 R2 系统上,微软把一些API函数从Psapi.dll 移到了 Kernel32.dll 动态库中,并在VS2010编译器自带的 WinSDK v7.0版本上面做了处理。这样的设计在Windows7 和 Windows Server 2008 R2系统上面没有问

题,但是如果你用vs2010编译的程序运行在Win7之前的系统上,那么肯定会遇到刚才说的错误。因为老系统的KERNEL32.dll中根本没有那些被移植过去的函数,所以肯定会执行失败。

受影响的函数如下:

#if (PSAPI_VERSION > 1)

#define EnumProcesses               K32EnumProcesses

#define EnumProcessModules          K32EnumProcessModules

#define EnumProcessModulesEx        K32EnumProcessModulesEx

#define GetModuleBaseNameA          K32GetModuleBaseNameA

#define GetModuleBaseNameW          K32GetModuleBaseNameW

#define GetModuleFileNameExA        K32GetModuleFileNameExA

#define GetModuleFileNameExW        K32GetModuleFileNameExW

#define GetModuleInformation        K32GetModuleInformation

#define EmptyWorkingSet             K32EmptyWorkingSet

#define QueryWorkingSet             K32QueryWorkingSet

#define QueryWorkingSetEx           K32QueryWorkingSetEx

#define InitializeProcessForWsWatch K32InitializeProcessForWsWatch

#define GetWsChanges                K32GetWsChanges

#define GetWsChangesEx              K32GetWsChangesEx

#define GetMappedFileNameW          K32GetMappedFileNameW

#define GetMappedFileNameA          K32GetMappedFileNameA

#define EnumDeviceDrivers           K32EnumDeviceDrivers

#define GetDeviceDriverBaseNameA    K32GetDeviceDriverBaseNameA

#define GetDeviceDriverBaseNameW    K32GetDeviceDriverBaseNameW

#define GetDeviceDriverFileNameA    K32GetDeviceDriverFileNameA

#define GetDeviceDriverFileNameW    K32GetDeviceDriverFileNameW

#define GetProcessMemoryInfo        K32GetProcessMemoryInfo

#define GetPerformanceInfo          K32GetPerformanceInfo

#define EnumPageFilesW              K32EnumPageFilesW

#define EnumPageFilesA              K32EnumPageFilesA

#define GetProcessImageFileNameA    K32GetProcessImageFileNameA

#define GetProcessImageFileNameW    K32GetProcessImageFileNameW

#endif

有个条件判断#if (PSAPI_VERSION > 1),也就是说只有当PSAPI_VERSION被定义为大于1的数值时才有这样的问题,所以解决方案就是将 PSAPI_VERSION 定义为小于等于1的数值就可以了,如下:

#define PSAPI_VERSION 1

最新
业务QQ