【发布时间】:2013-10-10 12:30:33
【问题描述】:
我使用带有参数 lpCurrentDirectory 的 createprocess() 从我的应用程序创建一个进程,但它不起作用。它给出错误“系统找不到指定的路径”。我的代码是
CreateProcess( "XYZ\\bin\\run.bat", NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, "XYZ\\bin", &siStartupInfo, &piProcessInfo ) ;
我还通过使用 GetCurrentDir() 获取当前目录并将 XYZ\\bin 添加到当前目录,将完整路径作为 lpCurrentDirectory,但它仍然不起作用。
我希望我的批处理文件从 lpCurrentDirectory 运行。
我不明白 createProcess() 如何与 lpCurrentDirectory 参数一起工作。是期望完整路径还是相对路径?
我也尝试过硬编码完整路径,但它显示相同的错误。实际上我的原始代码是, `
char cCurrentPath[FILENAME_MAX];
if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)))
{
printf("\n error...");
}
string path(cCurrentPath);
path += "\\XYZ\\bin";
wstring_convert<std::codecvt_utf8<wchar_t>> converter;
wstring wstringData = converter.from_bytes(path);
TCHAR lpszClientPath[500]= TEXT("XYZ\\bin\\run.bat /y");
if(::CreateProcess(NULL, lpszClientPath, NULL, NULL, TRUE, CREATE_NEW_CONSOLE,NULL, wstringData.c_str(), &si, &pi) > 0)
`。
【问题讨论】:
-
文档明确指出
lpCurrentDirectory必须是完整路径。您是否尝试过将有效的完整路径硬编码到您的代码中?另请注意,您不能直接启动批处理文件,而必须运行cmd /c xyz\\bin\\run.bat。 -
所有字符串操作和转换都可能给您带来麻烦。您是否尝试过使用
MessageBox(NULL, wstringData.c_str(), L"test", MB_OK)代替CreateProcess来查看您实际发送的目标目录是什么字符串?你有没有仔细检查过这个目标目录确实存在?为什么不使用GetCurrentDirectory来获取Unicode 格式的当前目录? -
注意:无论您的问题是什么,如果目录路径包含任何非 ASCII 字符,所编写的代码将不起作用。
-
感谢 Harry Johnston,我尝试 MessageBox,它显示正确的路径,并且目录也存在,我需要将目录路径添加到 currentDirectory 路径所以我使用 GetCurrentDir,我认为它失败了,因为我的路径在 GetCurrentDir 给出的路径中包含空格,它没有正确转换为 Unicode,它只需要空格之前的路径并给出错误 'XYZ' 内部或外部命令不存在。你有什么想法吗?
-
我发现如果我在 Windows-XP 中从桌面运行我的程序,它将无法工作,因为桌面路径是“c:\Documents and Settings\Desktop”,它在 Windows 7 上运行良好,我认为 CreateProcess() 无法识别它,或者它是转换为 Unicode 的问题。
标签: windows visual-c++ createprocess