使用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文件指定工作目录找不到文件的问题的更多相关文章

  1. WORKDIR 指定工作目录 每一个 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更

    WORKDIR 指定工作目录 格式为 WORKDIR <工作目录路径>. 使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不 ...

  2. Linux命令备忘录:mount用于加载文件系统到指定的加载点

    mount命令用于加载文件系统到指定的加载点.此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命 ...

  3. Python3 tesseract加载chi_sim异常停止工作

    Python3 tesseract加载chi_sim异常停止工作 原因: chi_sim.traineddata 和 tesseract3.0.2 版本不一致: 解决方案: 下载tesseract3. ...

  4. Linux课程---5、常用文件命令和目录命令(创建文件命令)

    Linux课程---5.常用文件命令和目录命令(创建文件命令) 一.总结 一句话总结: touch file1 1.管道符|有什么用? 将前一个命令的结果作为后一个命令的输入:比如查看文件前3行:ca ...

  5. Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】

    接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...

  6. 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据

    任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...

  7. rails 里js 在production 只合并不压缩等问题,以及assets pipeline 加载js 在指定页面上

    因为刚学rails,试着做了一个小系统操作微信公共帐号, 之后部署的时候遇见了一个问题,整套系统在互联网端访问,非常的慢,而在手机端访问,10s后才会有响应, 打开chrome的调试工具,发现appl ...

  8. WPF应用加载图片URI指定需要注意的地方

    应用程序(.exe)加载图片: 可以省略"pack://application:,,," 打头,因为系统运行时需要的图片文件在Exe程序集(组合体)中:譬如: <Image ...

  9. 动态加载EXE和DLL

    程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术.即:调用资源中的DLL. 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DL ...

随机推荐

  1. 关于oracle中(+)的运用

    一.基础 1.1 SQL查询的基本原理 第一.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果.第二.两表 ...

  2. Cesium 加载地形数据

    1.注册Cesium Ion账号,注册地址:Sign In | Cesium ion 否则,加载数据会报错{code: "InvalidCredentials", message: ...

  3. CSC.exe编译器使用

    如何用CSC.exe来编译Visual C#的代码文件 Visual C#是微软公司推出的新一代程序开发语言,Visual C#是微软公司.Net FrameWork框架中的一个重要的组成部分,也是微 ...

  4. Hadoop2.7.2源码编译过程

    目录 准备工作 jar包安装 源码编译 准备工作 CentOS可以联网,验证:ping www.baidu.com 是畅通的 jar 包准备(hadoop 源码.JDK8.maven.ant .pro ...

  5. Centos6/7系统基础配置-从零到无

    转至:https://www.cnblogs.com/Pigs-Will-Fly/p/13855300.html 目录 前言 系统配置 文档作用 一.Centos 6.X 系列配置 1.1  主机名 ...

  6. 《Symfony 5全面开发》教程03、使用Controller创建第一个页面

    我们使用Phpstorm打开我们的项目目录,展开项目目录文件夹. Symfony项目其实也是composer项目,如果你新拿到一个Symfony项目, 你可以在控制台中使用composer insta ...

  7. OJ教程--排序算法

    1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不 ...

  8. CentOS安装时,软件选择(Software Selection)项介绍

    要指定软件包将被安装,选择软件时选择安装摘要屏幕.包组分为基础环境.这些环境是预先定义的一组具有特定用途的软件包:例如,在虚拟化主机环境中包含的一组所需的系统上运行的虚拟机软件程序包.只有一个软件环境 ...

  9. php常见的危险函数

    代码执行的危险函数 eval() 把字符串作为php代码执行 早期php一句话木马都用这个 <?php @eval($_POST['shell']);?> assert() 检查一个断言是 ...

  10. Laravel—数据库操作与Eloquent模型使用总结

    数据库操作 执行原生SQL //查询 $emp = DB::select('select * from employees where emp_no = 1'); $emp = DB::select( ...