zoukankan      html  css  js  c++  java
  • 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运行会显示所在的目录路径,如:

    QQ截图20141121162154

    下面用四种情况验证:

    QQ截图20141121163817

    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;
    	}
    
    
    如果是:提示文件找不到。

    QQ截图20141121164131

    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

    QQ截图20141121162827

    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 ,与第二种情况一样

    QQ截图20141121162827

    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

    QQ截图20141121163022

    总结:使用ShellExecuteA调用exe文件时,如果需要指定被调程序的工作目录,exe文件的路径尽量使用绝对路径

  • 相关阅读:
    解析ASP.NET Mvc开发之EF延迟加载 分类: ASP.NET 2014-01-04 01:29 4017人阅读 评论(1) 收藏
    解析ASP.NET Mvc开发之查询数据实例 分类: ASP.NET 2014-01-02 01:27 5788人阅读 评论(3) 收藏
    解析ASP.NET Mvc开发之查询数据实例
    从明源动力到创新工场这一路走来
    从明源动力到创新工场这一路走来 分类: 程序人生 2013-12-29 07:37 2532人阅读 评论(2) 收藏
    解析ASP.NET WebForm和Mvc开发的区别 分类: ASP.NET 2013-12-29 01:59 11738人阅读 评论(5) 收藏
    解析ASP.NET WebForm和Mvc开发的区别
    MySQL--索引
    MySQL--存储过程
    MySQL--自定义函数
  • 原文地址:https://www.cnblogs.com/imzhstar/p/4113319.html
Copyright © 2011-2022 走看看