GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName

2023-05-16

一.学习 GetModuleFileName:

方法一:

想要访问执行程序(.exe)路径下的文件,有以下几个步骤:

    1.先通过函数GetModuleFileName获取执行程序的绝对路径

    TCHAR szPath[ MAX_PATH ] = {0};
    GetModuleFileName( NULL, szPath, MAX_PATH );

    其中GetModuleFileName函数为windows的API函数,使用的时候需要包含windows.h的头文件;MAX_PATH是一个宏定义,值为260。执行完GetModuleFileName函数之后,szPath数组中保存的就是执行程序当前的绝对路径。

假设执行程序xp.exe的绝对路径为C:\Program Files\Dll\xp.exe,那么szPath数组中存储的值就是C:\Program Files\Dll\xp.exe。

    2.根据执行程序的绝对路径得到需要访问的文件的绝对路径。

    这里需要用到_tcsrchr函数来将获取到的执行程序的绝对路径中的执行程序的名称去掉。即将上面路径C:\Program Files\Dll\xp.exe中的xp.exe去掉,只得到C:\Program Files\Dll\。方法如下:

    (_tcsrchr(szPath,_T('\\')))[1] = 0;

    注:_tcsrchr包含在头文件tchar.h中。

    3.将要访问的文件的名称添加到已经得到的路径中。

    假设需要访问的文件是1.txt,那么如下:

     CString strPath = szPath;
     strPath = strPath + "1.txt";

     在非MFC中,CString包含在atlstr.h头文件中,在MFC中包含在cstring.h的头文件中。

     程序整体如下:

     TCHAR szPath[ MAX_PATH ] = {0};
     if ( GetModuleFileName( NULL, szPath,MAX_PATH ) )
     {
      (_tcsrchr(szPath,_T('\\')))[1] = 0;
     }

     CString strPath = szPath;
     strPath = strPath + "1.txt";

 

函数原型分析:

GetModuleFileName函数原型
DWORD GetModuleFileName(
   HMODULE hModule,     // handle to module。将要得到的模块的句柄。如果是当前模块,NULL
   LPTSTR lpFilename,   // path buffer   得到的文件名。
   DWORD nSize          // size of buffer   一般MAX_PATH就可以了
);
可以通过以下方法获取路径名
 
char szCurPath[MAX_PATH]; //定义一个字符串数据,长度为MAX_PATH ,MAX_PATH是预定义的宏,一般是个数字常量如256
 
GetModuleFileName(NULL,szCurPath,_MAX_PATH);
 
char* p = szCurPath;
 
while(strchr(p,'\\'))
{
         p = strchr(p,'\\');
         p++;
}
 
*p = '\0';
 
CString strSwfname = szCurPath; 
szCurPath就是去除文件名的路径名

 

 

二.GetCurrentDirectory

是的到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。

可以理解成应用程序的当前工作目录。

原文标题:loadlibrary加载三方dll失败问题。 

前几天,在联网测试三方的dll,但是出现dll放到exe目录下面可以正常加载,如果单独放一个目录却出现126错误代码,找不到指定的模块。 由于三方dll使用zlib版本和exe使用的zlib版本不同,所以三方的dll又不能放到exe目录中,必须单独新建目录。于是在网上搜索得到以下解决方案:

方式一 采用LoadLibraryEx

若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载。但若调用的DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用LoadLibraryEx:

LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。


方式二 采用SetCurrentDir

跨目录调用dll,你应该这样

1 用GetCurrentDir保存当前的工作目录
2 用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢复到原来的工作路径

 

[cpp]   view plain  copy
  1. TCHAR chCurDir[MAX_PATH] = {0};  
  2. GetCurrentDirectory(MAX_PATH, chCurDir);  
  3. SetCurrentDirectory(_T("E:\\test\\"));  
  4. m_hDLL = LoadLibrary(_T("MyTest.dll"));  
  5. SetCurrentDirectory(chCurDir);  


 

总结:dll的加载顺序:

(1)EXE所在目录;
(2)当前目录GetCurrentDirectory();
(3)系统目录GetSystemDirectory();
(4)WINDOWS目录GetWindowsDirectory();
(5)环境变量 PATH 所包含的目录。

所以使用loadlibrary加载dll使用的路径,但是这个函数会忽略这个路径,只会按既定规则加载dll。所以如果要加载指定目录的dll,可以用上述两个解决方案。

转自:http://blog.csdn.net/lijianli9/article/details/9091453

ps:我用的是GetModuleFileName获取exe路径,然后再掉LoadLibraryEx解决LoadLibrary返回126的错误

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName 的相关文章

随机推荐

  • stm32L476RG,通过串口打印信息

    调试STM32L476RG时 xff0c 想要通过串口打印信息方法 xff1a 1 通过官方的历程 xff0c 移植USART的程序 xff0c 位置STM32Cube FW L4 V1 13 0 Projects NUCLEO L476R
  • k8s 1.18.20版本部署

    身为k8s初学者 xff0c 在掌握k8s理论知识的同时 xff0c 也需要掌握一下实际部署k8s的过程 xff0c 对于理论的学习起到一定的帮助作用 罗列了一下相关步骤 xff0c 请各位参考 xff1a 一 环境准备 三台虚机 xff1
  • java后端对接外部系统(HttpClient HttpPost)

    前言 最近遇到一个需求对接外部系统 xff0c 我们自己的系统发送请求 xff0c 根据请求内容的不同调用不同的外部系统 举例 xff1a 我们是做互联网医院的 xff0c 根据医生开处方选择药店的不同 xff0c 调用各药店自己的系统 x
  • “轻松搞定CMake”系列之find_package用法详解

    本文是 轻松搞定CMake 系列博客中的一篇 xff0c 该篇文章的主要目的是详细讲解一下CMake中搜包命令find package的使用和原理 其他更多文章请参考 xff1a 轻松搞定CMake 系列博客概述 文章目录 1 find p
  • 一遍成功的ROS主从机详细配置

    ROS支持多机互通 xff0c 可以设置一台主机 xff0c 多台从机 xff0c 主机中运行roscore xff0c 启动master节点 xff0c 从机直接运行其他节点 xff0c 在配置好的机器之间就可以互相通信了 xff0c 就
  • pip install列出待安装包的所有版本

    问题描述 一般我们在使用pip Install命令安装Python软件包的时候 xff0c 会想知道能安装的包版本的是多少 xff0c 这样方便自己选择可能的兼容版本进行安装 xff0c 在pip某个版本之前获取待安装包的所有版本命令比较简
  • ImportError with scipy.misc cannot import toimage错误解决

    问题描述 在使用如下代码时出现错误 xff1a span class token keyword import span scipy span class token punctuation span misc scipy span cla
  • AttributeError: module ‘requests‘ has no attribute ‘get‘

    问题描述 执行python程序时报错 xff1a AttributeError module span class token string 39 requests 39 span has no attribute span class t
  • Ubuntu下dpkg -i 安装deb报错 trying to overwrite shared

    问题表述 Ubuntu 22 04下 xff0c 执行下述命令时报错 xff1a 命令 xff1a span class token function sudo span dpkg i libglapi mesa 22 0 5 0ubunt
  • 4k高分屏Windows10下软件字体过小解决办法

    在Windows10下使用Matlab xff0c 由于是4k显示屏 xff0c 本来以为Matlab会出现字体过小的情况 xff0c 结果并没有出现什么问题 字体显示一切正常 xff0c 然而在打开Simulink时 xff0c Matl
  • Eigen矩阵运算开源库使用完全指南

    Eigen库是一个开源的矩阵运算库 xff0c 其利用C 43 43 模板编程的思想 xff0c 构造所有矩阵通过传递模板参数形式完成 由于模板类不支持库链接方式编译 xff0c 而且模板类要求全部写在头文件中 xff0c 从而导致导致Ei
  • “轻松搞定CMake”系列之CMakeLists文件编写语法规则详解

    文章目录 基本语法规则常见CMakeLists txt中指令剖析从VS项目配置过程理解CMakeLists内容CMake中常用变量汇总常用CMakeLists文件模板基础模板使用OpenCV库CMakeLists文件模板使用PCL库CMak
  • Centos7 XFS(dm-0):Internal error XFS_WANT_CORRUPTED_GOTO

    在k8s的道路上我们都是小白 xff0c 每天启动虚机都会遇到各种各样的问题 xff0c 这不 部署的k8s虚机启动发现操作系统启动异常 xff0c 提示如下报错信息 XFS xff08 dm 0 xff09 Internal error
  • 招聘笔试行测题之图形推理题解题思路汇总

    在一些公司的招聘过程中 xff0c 多少都会在笔试过程中遇到行测题 xff0c 这些行测题如果没有事先做过一些针对性的训练 xff0c 还是会感觉挺费劲的 xff0c 本博客主要汇总行测题中的图形推理题的一些解题思路 xff0c 供大家参考
  • ROS之tf空间坐标变换完全详解

    本博文主要汇总了自己在使用ROS中tf坐标变换包时查找的一些参考资料和博客 xff0c 包括了tf和部分tf2的使用 xff0c 在此感谢本博文中出现的所有的博客链接 xff01 参考资源 xff1a ROS官网详细介绍 xff1a htt
  • Word2016写论文之尾注功能——参考文献自动编号与引用(包括方括号去除方法)

    本系列文章主要详细介绍本人在使用Word2016写论文过程所用到的各种操作 xff0c 这些操作都非常的实用 xff0c 能够大为减少论文排版的工作量 其中很多方法也都是参考网上一些优秀博客的 xff0c 经过本人的实践成功之后才记录在此
  • vnc 设置不同用户登录

    a 在root用户下切换到其他用户 xff0c 以wolf用户为例 xff1a su wolf b 设置vnc连接密码 xff1a vncpasswd c 启动vnc服务 xff1a vncserver
  • 推荐几款常用的性能测试工具

    对内容不感兴趣拉到最后领取今天的外卖红包 常用的性能测试工具 对于开发人员来说 xff0c 首选是一些开源免费的性能 xff08 压力 xff09 测试软件 xff0c 例如 ab xff08 ApacheBench xff09 JMete
  • kubeadmin 快速部署k8s集群

    安装要求 在开始之前 xff0c 部署Kubernetes集群机器需要满足以下几个条件 xff1a 一台或多台机器 xff0c 操作系统 CentOS7 x 86 x64硬件配置 xff1a 2GB或更多RAM xff0c 2个CPU或更多
  • GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName

    一 学习 GetModuleFileName xff1a 方法一 xff1a 想要访问执行程序 exe 路径下的文件 xff0c 有以下几个步骤 xff1a 1 先通过函数GetModuleFileName获取执行程序的绝对路径 TCHAR