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 ...
随机推荐
- Redis 中 String 类型的内存开销比较大
使用 String 类型内存开销大 1.简单动态字符串 2.RedisObject 3.全局哈希表 使用 Hash 来存储 总结 参考 使用 String 类型内存开销大 如果我们有大量的数据需要来保 ...
- OC之判断数组最大最小值
超简单的筛选方法 array为你筛选的数组 NSNumber * max = [Array valueForKeyPath:@"@max.floatValue"]; NSNumbe ...
- linux安装ngixn
卸载ngxin(第一次安装请略过) 1.检查nginx是否启动,是否安装ngxin 检查是否安装nginx命令 rpm -qa|grep nginx 检查nginx是否启动命令: pa -ef|gre ...
- BI工具的选择标准有哪些?
作为企业的IT部门如果没有良好的BI工具支持,IT部门将会十分容易陷入困境.那么面对多元化的BI工具市场,IT部门如何选择BI工具呢?BI工具选择的标准又是什么?Smartbi将为大家做一个简单的解答 ...
- ASP.NET Core 6框架揭秘实例演示[14]:日志的进阶用法
为了对各种日志框架进行整合,微软创建了一个用来提供统一的日志编程模式的日志框架.<日志的基本编程模式>以实例演示的方式介绍了日志的基本编程模式,现在我们来补充几种"进阶" ...
- 【C# 线程】RPC中常见的Stub| marshalling怎么理解
RPC服务的基本架构图如上,可以很清楚地看到,一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理 ...
- Thread、ThreadPool 和 Task
对 C# 开发者来说,不可不理解清楚 Thread.ThreadPool 和 Task 这三个概念.这也是面试频率很高的话题,在 StackOverflow 可以找到有很多不错的回答,我总结整理了一下 ...
- 60天shell脚本计划-6/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月21日 --修改时间:2021年2月25日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- Ansible安装及初始化-从零到无
--时间:2019年1月12日 --作者:飞翔的小胖猪 前言 说明 文档指导读者在Redhat系列操作系统上安装Ansible软件及初始化配置,包括服务端及被控端的配置文件设置. 以下所有操作都在An ...
- appium报错Message: Cannot set the element to ‘XXXX’. Did you interact with the correct element?
appium+python+android 在定位到模块输入内容的时候遇到了一个问题 send_keys报错 appium报错Message: Cannot set the element to 'X ...