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的工作目录

使用的代码:

1

2

3

4

5

6

7

8

9

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;

    }

1

 

1

如果是:提示文件找不到。

QQ截图20141121164131

2、test2.exe

使用相对路径加载a\\a.exe,不指定a.exe的工作目录

使用的代码:

1

2

3

4

5

6

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的工作目录

使用的代码:

1

2

3

4

5

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的工作目录

使用的代码:

1

2

3

4

5

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文件的路径尽量使用绝对路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值