VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 11441|回复: 2

[交流] 无法定位程序输入点K32EnumProcessModules于动态链接库KERNEL32.dll上 的错误解析

[复制链接]
51_avatar_middle
online_admins 发表于 2016-1-7 13:05:33 | 显示全部楼层 |阅读模式
这里我要讨论的是在 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中根本没有那些被移植过去的函数,所以肯定会执行失败。

//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-260777-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

受影响的函数如下:
  1. //Snapshot from Psapi.lib – WinSDK V7.0*
  2. #if (PSAPI_VERSION > 1)
  3. #define EnumProcesses               K32EnumProcesses
  4. #define EnumProcessModules          K32EnumProcessModules
  5. #define EnumProcessModulesEx        K32EnumProcessModulesEx
  6. #define GetModuleBaseNameA          K32GetModuleBaseNameA
  7. #define GetModuleBaseNameW          K32GetModuleBaseNameW
  8. #define GetModuleFileNameExA        K32GetModuleFileNameExA
  9. #define GetModuleFileNameExW        K32GetModuleFileNameExW
  10. #define GetModuleInformation        K32GetModuleInformation
  11. #define EmptyWorkingSet             K32EmptyWorkingSet
  12. #define QueryWorkingSet             K32QueryWorkingSet
  13. #define QueryWorkingSetEx           K32QueryWorkingSetEx
  14. #define InitializeProcessForWsWatch K32InitializeProcessForWsWatch
  15. #define GetWsChanges                K32GetWsChanges
  16. #define GetWsChangesEx              K32GetWsChangesEx
  17. #define GetMappedFileNameW          K32GetMappedFileNameW
  18. #define GetMappedFileNameA          K32GetMappedFileNameA
  19. #define EnumDeviceDrivers           K32EnumDeviceDrivers
  20. #define GetDeviceDriverBaseNameA    K32GetDeviceDriverBaseNameA
  21. #define GetDeviceDriverBaseNameW    K32GetDeviceDriverBaseNameW
  22. #define GetDeviceDriverFileNameA    K32GetDeviceDriverFileNameA
  23. #define GetDeviceDriverFileNameW    K32GetDeviceDriverFileNameW
  24. #define GetProcessMemoryInfo        K32GetProcessMemoryInfo
  25. #define GetPerformanceInfo          K32GetPerformanceInfo
  26. #define EnumPageFilesW              K32EnumPageFilesW
  27. #define EnumPageFilesA              K32EnumPageFilesA
  28. #define GetProcessImageFileNameA    K32GetProcessImageFileNameA
  29. #define GetProcessImageFileNameW    K32GetProcessImageFileNameW
  30. #endif
复制代码


通过上面的解释,你应该明白为什么出现那样的错误了吧?也大体上知道怎么样改正这个错误了。不知道大家注意到没有,有个条件判断#if (PSAPI_VERSION > 1),也就是说只有当PSAPI_VERSION被定义为大于1的数值时才有这样的问题,所以解决方案就是将 PSAPI_VERSION 定义为小于等于1的数值就可以啦,如下:
  1. #define PSAPI_VERSION 1
复制代码


OK,就说到这里吧,有什么不明白的可以回帖提问,也建议大家再阅读下英文版的解释。
原文链接:http://blogs.msdn.com/b/vcblog/a ... ity-workaround.aspx

//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-260777-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////




上一篇:读写文件用c++封装的几种方法
下一篇:MFC中的_T宏
26_avatar_middle
在线会员 发表于 2016-7-14 11:31:10 来自手机 | 显示全部楼层
我就笑笑不说话1468465817.23
06_avatar_middle
在线会员 发表于 2017-8-2 10:53:07 | 显示全部楼层
请问
#define PSAPI_VERSION 1
添加在哪个位置?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-19 06:56

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表