宣城做网站的公司,推广公司名字 有创意,成都网站游戏设计,海口建设公司网站之前项目中发现的问题#xff0c;记录下解决方案1. 问题背景OVVRNTool项目中#xff0c;底层图像基本操作功能由DLL库函数提供#xff0c;上层基于DLL封装了两个应用CMD和GUI#xff0c;然后通过Qt打包分发#xff1b;发布是直接采用绿色免安装的方式打包#xff0c;具体…之前项目中发现的问题记录下解决方案1. 问题背景OVVRNTool项目中底层图像基本操作功能由DLL库函数提供上层基于DLL封装了两个应用CMD和GUI然后通过Qt打包分发发布是直接采用绿色免安装的方式打包具体使用release中的exe进行windeployqt的方式将依赖库等打包进一个文件夹由于CMD的特殊性命令行工具用户只希望出现一个单独的exe而不想要一个文件夹包含一大堆库和文件所以采用enigma virtual box工具将文件夹打包成单个exe这时发现一个奇怪的问题当运行系统CMD时直接调用exe不管是enigma打包的还是文件夹中的会报错找不到DLL库函数配置文件同事开发的底层库但是运行CMDcd到exe当前目录就没有问题2. 问题定位通过打印库运行时配置文件路径定位出现该问题是因为DLL找不到它同路径下的配置文件底层库默认配置文件和它在一个路径下在读取配置文件使用了相对路径系统CMD启动是在C盘这时候调用exe导致库认为运行目录在C盘导致相对路径出错找不到配置文件。3. 解决方案在DLL库调用配置文件时先获取自身所在的路径然后拼接配置文件路径Windows下获取dll完整路径的方法#include windows.h#include string //windows下获取当前dll的句柄HMODULE GetSelfModuleHandle(){ MEMORY_BASIC_INFORMATION mbi; return ((::VirtualQuery(GetSelfModuleHandle, mbi, sizeof(mbi)) ! 0) ? (HMODULE)mbi.AllocationBase : NULL);}//在程序中通过调用该函数即可获取到dll的完整路径至strDllFullPath中void GetFullPathOfDll(std::string strDllFullPath){ char szPath[MAX_PATH]; GetModuleFileNameA(GetSelfModuleHandle(),szPath,MAX_PATH); strDllFullPath std::string(szPath);}