假如有个外部程序名为A.exe,放在目录E: emp下,然后我们用C++或者C#写一个程序调用这个A.exe的话(假设这个调用者所在的路径在D:invoke),通常会采用下面的代码:
// C# code string exeName = @"E: empA.exe"; Process g = new Process(); g.StartInfo.UseShellExecute = false; g.StartInfo.RedirectStandardOutput = false; g.StartInfo.FileName = exeName; g.StartInfo.CreateNoWindow = false; g.StartInfo.Arguments = "-R"; // Supposing there is a "-R" parameter g.Start(); g.WaitForExit();
// C++ code SHELLEXECUTEINFO ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = TEXT("open"); ShExecInfo.lpFile = TEXT("E:\temp\A.exe"); ShExecInfo.lpParameters = TEXT("-R"); ShExecInfo.nShow = SW_HIDE; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); WaitCursorBegin(); WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
但是当我们的A.exe程序中使用相对路径创建或者打开文件时,就会发现用上面程序调用A.exe时,会提示无法创建文件或者无法打开文件,其原因是:
- A.exe的调用者和A.exe不在同一个目录下;
- 当异地调用A.exe时,A.exe程序里的相对路径都是相对于其调用者所在的目录而言(都是相对于D:invoke)
解决办法很简单:
- C#代码中,加入g.StartInfo.WorkingDirectory = @"E: emp";
- C++代码中,加入ShExecInfo.lpDirectory = TEXT("E:\temp\");
- 上面两行代码的作用是指定A.exe运行的目录,这样就保证了A.exe里面使用的相对于路径是相对于A.exe所在的目录,即E: emp