The procedure entry point XXX could not be located in the dynamic link library XXX.dll

本文详细解析了dll文件版本不匹配引起的问题,并提供了采用显示调用和手工加载的方法来解决该问题的步骤。通过声明函数指针原型、使用LoadLibrary()函数加载dll文件以及通过GetProcAddress()获取函数地址,可以避免dll文件版本不匹配带来的运行错误。
部署运行你感兴趣的模型镜像

原因及分析:

此时由于.library和.dll文件版本不匹配造成的。比如.lib里有20个函数,.dll只有19个函数,当windows加载动态链接库的时候,它检查是否匹配,否则报错。

在项目需要运行多个不同版本的dll文件时候,容易出现此问题。此时隐式调用Dll。

解决办法:

采用显示调用,手工加载的办法。

1)声明函数指针原型。

2)LoadLibrary()

3)GetProcAddress()

4)比较重要,在调用此函数指针的时候,判断是否NULL。因为在dll文件里没有实现的函数指针是NULL。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在处理一个关于Windows7系统中使用Qt时出现的动态链接库错误:找不到`getpointerframetouchinfo`函数入口点的问题。错误信息指出该过程入口点在`user32.dll`中无法定位。###问题分析1.**错误原因**:`getpointerframetouchinfo`是一个与触摸输入相关的WindowsAPI函数,它是在Windows8中引入的。因此,在Windows7系统中,`user32.dll`并不包含这个函数。2.**Qt框架的兼容性**:Qt框架在较新的版本中可能使用了这个函数,而该函数在Windows7上不可用。因此,当在Windows7上运行使用新版本Qt编译的程序时,可能会遇到这个错误。###解决方案####方法1:使用兼容的Qt版本-重新编译Qt源代码,并确保在编译时禁用与触摸相关的功能,或者使用支持Windows7的较旧版本的Qt。-具体步骤:1.从[Qt下载页面](https://download.qt.io/)下载与Windows7兼容的Qt版本(例如5.6或更早版本)或者下载源代码并自行编译。2.在编译Qt源代码时,配置选项以排除对`getpointerframetouchinfo`的依赖。可以通过设置环境变量或修改配置脚本来实现。####方法2:使用预编译的兼容版本-如果不想自己编译,可以寻找已经为Windows7编译好的Qt版本。一些第三方可能提供了这样的构建版本。 ####方法3:在代码中动态加载函数(仅适用于开发人员)-如果正在开发Qt应用程序,可以修改代码,在调用触摸相关函数之前检查Windows版本。例如:```cpp#include<Windows.h>typedefBOOL(WINAPI *GetPointerFrameTouchInfoFunc)(UINT32, UINT32*, POINTER_TOUCH_INFO*);//在需要调用该函数的地方HMODULEuser32 =LoadLibraryA("user32.dll");if(user32){GetPointerFrameTouchInfoFuncfunc =(GetPointerFrameTouchInfoFunc)GetProcAddress(user32,"GetPointerFrameTouchInfo");if (func){//调用函数} else{//处理Windows7的情况,使用替代方法}FreeLibrary(user32);}```-这种方法需要修改Qt源代码,因此比较复杂,除非是自定义Qt构建,否则不推荐。####方法4:更新Windows7系统(可能无效) -尽管Windows7已经停止支持,但可以尝试安装所有可用的更新(包括SP1),但注意这个函数是在Windows8中引入的,因此更新Windows7不会添加该函数。 ####方法5:使用兼容层(实验性)-可以尝试创建一个垫片DLL(shimDLL)来拦截对`getpointerframetouchinfo`的调用,并提供一个空实现或返回错误代码。但这种方法可能导致触摸功能不可用,且需要一定的开发经验。 ###推荐方案对于大多数用户,最简单的解决方案是**使用一个为Windows7编译的Qt版本**(方法1或方法2)。如果作为开发者,你可以选择方法3来修改你的应用程序,但这需要深入了解Qt的内部机制。###注意事项-在编译Qt时,确保使用与目标系统(Windows7)兼容的编译器(例如,使用Visual Studio2010或2012,而不是更高版本)。-如果使用预编译的Qt版本,请确保该版本明确支持Windows7。 §§相关问题§§1.如何检查Windows操作系统的版本以确定API函数的可用性? 2.Windows7上编译Qt源代码的具体步骤是什么?3.如何为Qt框架创建垫片DLL来解决API兼容性问题?</think>### Windows 7 Qt "getpointerframetouchinfo" 入口点错误解决方案 #### 问题原因分析 `getpointerframetouchinfo` 是 Windows 8 引入的触摸屏 API 函数[^1]。当在 Windows 7 上运行使用较新 Qt 版本(5.15+)编译的程序时,会出现此错误,因为: 1. Windows 7 的 `user32.dll` 不包含此函数 2. Qt 5.15+ 默认启用了触摸输入支持 3. 程序尝试调用不存在的 API 导致入口点错误 #### 解决方案 ##### ✅ 方法1:使用兼容的Qt版本 **推荐方案** - 重新编译项目: 1. 下载 Qt 5.14 或更早版本(支持 Win7 的最后一个版本) ```bash # 使用维护工具安装旧版本 qt-unified-windows-x64-4.6.0-online.exe --install 5.14.2 ``` 2. 在项目配置中指定兼容版本: ```qmake # 在 .pro 文件中添加 win32: { QMAKE_CXXFLAGS += -D_WIN32_WINNT=0x0601 # 强制 Win7 API 兼容 LIBS += -luser32 } ``` ##### ✅ 方法2:禁用触摸功能 修改 Qt 源码并重新编译: 1. 编辑 `qtbase/src/plugins/platforms/windows/qwindowscontext.cpp` 2. 注释掉相关调用: ```cpp // 查找以下代码并注释 // if (GetPointerFrameTouchInfo) // { // ... // 包含 getpointerframetouchinfo 的代码块 // } ``` 3. 重新编译 Qt: ```bash configure -prefix "C:\Qt\5.15-custom" -no-feature-touch nmake ``` ##### ✅ 方法3:API 代理DLL(高级) 创建代理 DLL 拦截调用: 1. 使用 MinGW 编译代理 DLL: ```cpp // proxy.cpp #include <windows.h> extern "C" __declspec(dllexport) BOOL WINAPI GetPointerFrameTouchInfo(...) { return FALSE; // 始终返回失败 } ``` ```bash g++ -shared -o user32_proxy.dll proxy.cpp -luser32 ``` 2. 将生成的 DLL 放在程序目录,通过 `.manifest` 文件重定向: ```xml <!-- application.manifest --> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="user32" /> <redirectFrom version="6.2.0.0" /> <redirectTo version="6.1.0.0" /> </dependentAssembly> </dependency> ``` #### 预防措施 1. 开发环境配置: ```powershell # 设置全局兼容标志 [System.Environment]::SetEnvironmentVariable( "QT_COMPAT_LAYER", "DisableHighDpiScaling;NoTouchInput", [System.EnvironmentVariableTarget]::User) ``` 2. 安装 Windows 7 平台更新补丁: - KB2670838(平台更新) - KB2834140(DirectX 更新) > **关键提示**:Qt 官方已终止对 Windows 7 的官方支持[^1]。长期项目建议升级到 Windows 10+ 或使用跨平台框架如 Flutter。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值