无法定位程序输入点K32Get Module File Name Ex于动态链接库KERNEL32.dll上 的错误解析

    xiaoxiao2021-03-25  216

    这里我要讨论的是在 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")

    转载请注明原文地址: https://ju.6miu.com/read-38610.html

    最新回复(0)