ShellExecuteA加载exe文件指定工作目录找不到文件的问题
使用ShellExecuteA调用exe文件时,指定工作目录需要注意
函数原型为:
HINSTANCE ShellExecuteA(
HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );
MSDN中对lpDirectory是这样说明的:
[in] A pointer to a null-terminated string that specifies the default (working) directory for the action. If this value is NULL, the current working directory is used. If a relative path is provided at lpFile, do not use a relative path for lpDirectory.
注意最后一句:如果lpFile提供的是相对路径,则lpDirectory不能使用相对路径。
咋看这句还以为是:如果lpFile提供了相对路径,lpDirectory可以使用绝对路径,可是实验却不是如此。
下面用程序举列:目录为C:\\temp
a文件夹里放置被调程序a.exe,a.exe运行会显示所在的目录路径,如:

下面用四种情况验证:

1、test1.exe
使用相对路径加载a\\a.exe,并指定了a.exe的工作目录
使用的代码:
char* workDir = "C:\\temp\\a\\";
HINSTANCE ret; //使用相对路径,指定工作目录:文件找不到
ret = ShellExecuteA(NULL, "open", "a\\a.exe", NULL, workDir, SW_SHOWNORMAL);
if ((int)ret == ERROR_FILE_NOT_FOUND)
{
std::cout << "使用相对路径,指定工作目录:文件找不到" << std::endl;
}
如果是:提示文件找不到。

2、test2.exe
使用相对路径加载a\\a.exe,不指定a.exe的工作目录
使用的代码:
char* workDir = "C:\\temp\\a\\";
HINSTANCE ret; //使用相对路径,未指定工作目录:文件加载正常
//a.exe的工作目录为 "C:\\temp\\"
ret = ShellExecuteA(NULL, "open", "a\\a.exe", NULL, NULL, SW_SHOWNORMAL);
结果,a.exe可以正常加载,但a.exe显示的工作目录为 C:\\temp

3、test3.exe
使用相对路径加载a\\a.exe,不指定a.exe的工作目录
使用的代码:
char* workDir = "C:\\temp\\a\\";
HINSTANCE ret;
//使用绝对路径,未指定工作目录:文件加载正常
//a.exe的工作目录为 "C:\\temp\\"
ret = ShellExecuteA(NULL, "open", "C:\\temp\\a\\a.exe", NULL, NULL, SW_SHOWNORMAL);
结果,a.exe可以正常加载,但a.exe显示的工作目录为 C:\\temp ,与第二种情况一样

4、test4.exe
使用绝对路径加载 a\\a.exe,同时指定a.exe的工作目录
使用的代码:
char* workDir = "C:\\temp\\a\\";
HINSTANCE ret;
// //使用绝对路径,指定工作目录:文件加载正常
// //a.exe的工作目录为 "C:\\temp\\a\\"
ret = ShellExecuteA(NULL, "open", "C:\\temp\\a\\a.exe", NULL, workDir, SW_SHOWNORMAL);
结果,a.exe可以正常加载,但a.exe显示的工作目录为 C:\\temp\\a

总结:使用ShellExecuteA调用exe文件时,如果需要指定被调程序的工作目录,exe文件的路径尽量使用绝对路径
ShellExecuteA加载exe文件指定工作目录找不到文件的问题的更多相关文章
- WORKDIR 指定工作目录 每一个 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更
WORKDIR 指定工作目录 格式为 WORKDIR <工作目录路径>. 使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不 ...
- Linux命令备忘录:mount用于加载文件系统到指定的加载点
mount命令用于加载文件系统到指定的加载点.此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命 ...
- Python3 tesseract加载chi_sim异常停止工作
Python3 tesseract加载chi_sim异常停止工作 原因: chi_sim.traineddata 和 tesseract3.0.2 版本不一致: 解决方案: 下载tesseract3. ...
- Linux课程---5、常用文件命令和目录命令(创建文件命令)
Linux课程---5.常用文件命令和目录命令(创建文件命令) 一.总结 一句话总结: touch file1 1.管道符|有什么用? 将前一个命令的结果作为后一个命令的输入:比如查看文件前3行:ca ...
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】
接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...
- 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...
- rails 里js 在production 只合并不压缩等问题,以及assets pipeline 加载js 在指定页面上
因为刚学rails,试着做了一个小系统操作微信公共帐号, 之后部署的时候遇见了一个问题,整套系统在互联网端访问,非常的慢,而在手机端访问,10s后才会有响应, 打开chrome的调试工具,发现appl ...
- WPF应用加载图片URI指定需要注意的地方
应用程序(.exe)加载图片: 可以省略"pack://application:,,," 打头,因为系统运行时需要的图片文件在Exe程序集(组合体)中:譬如: <Image ...
- 动态加载EXE和DLL
程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术.即:调用资源中的DLL. 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DL ...
随机推荐
- Asp.Net Core: Swagger 与 Identity Server 4
Swagger不用多说,可以自动生成Web Api的接口文档和客户端调用代码,方便开发人员进行测试.通常我们只需要几行代码就可以实现这个功能: ... builder.Services.AddSwag ...
- m0n0wall安装教程
m0n0wall的镜像链接:https://pan.baidu.com/s/1soIw7cS1Tv180fbo2655UA 提取码:dpon 一.新建虚拟机 新建虚拟机我想大家都会,详细步骤我就不陈述 ...
- 【windows 操作系统】线程句柄HANDLE与线程ID的关系
什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...
- HMS Core挑战赛故事:鞋、街景、手办、玩具,原来这些都可以3D建模
HMS Core线上Codelabs挑战赛第3期中,开发者通过学习和运用HMS Core开发的3D建模服务,生成3D建模应用demo,再使用demo为自己身边的一个实物完成建模.在提交的作品中,小编发 ...
- Linux命令(ping-telnet-netstat-curl-ps)
转至:https://www.jianshu.com/p/577bbd15a6f8 1.ping命令 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信 ...
- Qt:QDateTimeEdit
0.说明 QDateTimeEdit类提供了一个用于编辑Date和Time的Widget,它就像下边这样 QDateTimeEdit允许用户使用键盘编辑Date.或者用方向键来增加或减少Date.Ti ...
- JZ-062-二叉查找树的第 K 个结点
二叉查找树的第 K 个结点 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点. 题目链接: 二叉查找树的第 K 个结点 代码 /** * 标题:二叉查找树的第 K 个结点 * 题目描述 * 给定 ...
- 微服务从代码到k8s部署应有尽有系列(十三、服务监控)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- 2022年官网下安装RabbitMQ最全版与官网查阅方法
目录 一.Erlang环境部署 1.百度搜索"Erlang",或者访问网址:https://www.erlang.org/,找到DOWNLOAD双击进入. 2.找到支持的windo ...
- 手写 Vue 系列 之 从 Vue1 升级到 Vue2
前言 上一篇文章 手写 Vue 系列 之 Vue1.x 带大家从零开始实现了 Vue1 的核心原理,包括如下功能: 数据响应式拦截 普通对象 数组 数据响应式更新 依赖收集 Dep Watcher 编 ...