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