[置顶] 无法定位程序输入点K32Get Module File Name Ex于动态链接库KERNEL32.dll上 的错误解析
2017-03-13 08:58
218 查看
这里我要讨论的是在 WinSDK v7.0中的一些不友好的错误。如果你是一名开发者,并且当前使用的是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中根本没有那些被移植过去的函数,所以肯定会执行失败。
受影响的函数如下:
//Snapshot from Psapi.lib – WinSDK V7.0*
#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的数值就可以啦,如下:
要加在#include
<Psapi.h>上面
#ifndef PSAPI_VERSION
#define PSAPI_VERSION 1
#endif
#include <Tlhelp32.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
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中根本没有那些被移植过去的函数,所以肯定会执行失败。
受影响的函数如下:
//Snapshot from Psapi.lib – WinSDK V7.0*
#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的数值就可以啦,如下:
要加在#include
<Psapi.h>上面
#ifndef PSAPI_VERSION
#define PSAPI_VERSION 1
#endif
#include <Tlhelp32.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
相关文章推荐
- Win764bit上安装32位Oracle10g出现错误:无法定位程序输入点GetProcessImageFileNameW于动态链接库PSAPI.DLL
- 无法定位程序输入点GetProcessImageFileNameW 于动态链接库PSAPI.DLL上 ORA-12546
- Win764bit下安装32位Oracle10g出现异常:无法定位程序输入点GetProcessImageFileNameW于动态链接库PSAPI.DLL
- oracle安装(win7#64安装oracle10#32)解决无法定位程序输入点GetProcessImageFileNameW于动态链接库PSAPI.DLL
- Win764bit上安装32位Oracle10g出现错误:无法定位程序输入点GetProcessImageFileNameW于动态链接库PSAPI.DLL
- 无法定位程序输入点……于动态链接库KERNEL32.dll上
- Qt生成exe错误:无法定位程序输入点_cxa_throw_bad_array_new_length于动态链接库最终解决方法
- \t\t无法定位程序输入点AssocGetPerceivedType于动态链接库shlwapi.dll上.
- 无法定位程序输入点AssocGetPerceivedType于动态链接库shlwapi.dll上.
- 微信开发工具启动时提示无法定位程序输入点ReleaseSRWLockExclusive于动态链接库kernel32.dll上
- (转)64bit上安装32位oracle 10 g出现错误:无法定位承诺工序输入点 getprocessimagifilenamew 于动态链接库PSAPI.DLL
- Weblogic 安装报错:无法定位程序输入点于动态链接库kernel32.dll上
- [opencv][MFC]无法定位程序输入点GetTickCount64于动态链接库KERNEL32.dll上
- 解决WIN7下安装飞信出现“无法定位程序输入点dwmhintdxupdate于动态链接库user32.dll”错误
- Sqlplus登录时出现无法定位程序输入点longjmp于动态链接库的错误提示
- windows server 2003 安装软件就报错“无法定位程序输入点Encodepointer于动态链接库KERNEL32.dll上”
- 无法定位程序输入点K32EnumProcessModules于动态链接库KERNEL32.dll上
- 解决 :php 无法定位程序输入点 于动态链接库
- 无法定位程序输入点sqlite3_wal_checkpoint于动态链接库SQLite3.dll
- 无法定位程序输入点***于动态链接库QtCore4.dll的解决方法