解决Qt发布的程序在xp环境下提示“无法定位程序输入点 K32GetModuleFileNameExA 于动态链接库 KERNEL32.dll 上”的错误

用Qt开发时,调用系统API函数时的问题,在win7及以上系统没什么大问题。在xp下出现了标题描述的现象,导致无法启动程序。看了下网上的解决方案如下:

这里我要讨论的是在 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中根本没有那些被移植过去的函数,所以肯定会执行失败。

受影响的函数如下:

  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的数值就可以啦,如下:

要加在#include <Psapi.h>上面

#ifndef PSAPI_VERSION
#define PSAPI_VERSION  1
#endif

#include <Tlhelp32.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")

至此可以解决问题,注意红色字体部分,开始只加了上半部分,直接编译异常,把后面一行红色部分加入后才可以。刚开始涉足Qt,碰到的问题网上大都能解决,该问题列出供自己参考。

原文地址:https://www.cnblogs.com/acmexyz/p/8521843.html

时间: 2024-10-27 01:23:43

解决Qt发布的程序在xp环境下提示“无法定位程序输入点 K32GetModuleFileNameExA 于动态链接库 KERNEL32.dll 上”的错误的相关文章

无法定位程序输入点 CreateUri 于动态链接库 urlmon.dll 上。

笔记本换成XP系统后,打开风行的时候,回报下面的错误: --------------------------- Msg: FunshionWeb.exe - 无法找到入口 --------------------------- 无法定位程序输入点 CreateUri 于动态链接库 urlmon.dll 上. --------------------------- 确定 --------------------------- 解决方法: 打开开始--运行 输入msconfig回车 打开启动选项卡

转 无法定位程序输入点fesetround于动态链接库MSVCR120.dll上

Mysql  安装时报错: 无法定位程序输入点fesetround于动态链接库MSVCR120.dll上 解决方法:下载 Microsoft Visual C++ 2013 Redistributable Package 安装 https://support.microsoft.com/en-us/help/3138367/update-for-visual-c-2013-and-visual-c-redistributable-package 下载地址: http://download.mic

无法定位程序输入点 K32GetProcessMemoryInfo于动态链接库kernel32.dll之上

这是由于GetProcessMemoryInfo在不同系统版本号不同导致的,官方说明如下: Remarks Starting with Windows 7 and Windows Server 2008 R2, Psapi.h establishes version numbers for the PSAPI functions. The PSAPI version number affects the name used to call the function and the library

关于“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题

费劲N多力气编译通过之后,最后启动程序过程中却突然得到“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题, 分析究其原因是定位不到zlib1.dll,都知道,程序在找dll的时候如果工程目录中没有指定,会到$HOME/Windows/System32这个文件夹下面寻找需要的dll文件, 那么,就去System32文件夹下面看看是不是存在zlib1.dll这个文件,我翻看我的文件夹,发现没有这个文件,于是下载zlib1.dll拷贝到文件夹下.如果存在该文件, 还是出现上面那

无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll

这几天在捣腾CUDA,用vs2012跑那个经典的julia例程的时候出了问题. 问题如题. 找了很多方法--最后自己误打误撞成功了. 步骤就是: 1)从网上下载glut的包包.里面应该会含有一个.h一个.dll和一个.lib 如果你是64位系统,把.dll放到c:/windows/sysWOW64   就是用新的glut32.dll覆盖掉原来那个 2)然后把.h和.lib文件放到对应的地方. 我下载的是cuda_by_examples那个源码包包,所以这两个的位置就在common文件夹和lib文

Windows XP环境下 搭建Android NDK环境

搭建Android NDK环境 Windows XP环境下 1 一些下载 ① NDK r7:http://developer.android.com/sdk/ndk/index.html ② cygwin:http://www.cygwin.com/  (1.7.11-1)③ notepad++:http://notepad-plus-plus.org/download/v5.9.8.html 2 cygwin安装 ① 执行下载的setup.exe.点Next② 选择安装方式.选择在线安装.假设

在linux环境下编译运行OpenCV程序的两种方法

原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式. 首先我先粘上我测试的代码吧,文件名为Test.c 1 #include <highgui.h> 2 3 int main(int argc,char ** argv) { 4 5 IplImage* img = cvLoadImage

windows xp系统下提示Nsis Error错误的解决方法

通常我们在使用windows xp系统的过程中,经常会遇到一些故障问题,这不,使用windows xp系统的用户表示在使用系统的过程中出现提示Nsis Error错误的情况,其实这个问题也并不是常见,但是解决起来也非常的麻烦,那么,针对这样的问题,我们应该怎么来处理呢?以下是具体的操作步骤. 解决方法介绍: 1.英文意思:运行一个用Nullsoft Scriptable Install System (NSIS)建立的程序常会发生这种错误,起因可能是下载来的文件不完整,或存放该程序的磁盘区坏了,

Sqlplus登录时出现无法定位程序输入点longjmp于动态链接库的错误提示

问题描述:当我们如下Oracle sqlplus登录时出现无法定位程序输入点longjmp于动态链接库D:\app\porry\product\11.2.0\dbhome_1\bin\oracore11.dll上的错误提示. 或者,在利用Oracle PL/SQL Developer客户端登录时出现 ora-12514错误提示,但是TNS配置没有错误,错误截图如下: 解决方案:出现该问题原因在于我们安装了Oracle之后,又安装了Oracle开发工具Oracle Developer Suit.从