创建在所选目录中打开的命令提示符进程

时间:2017-05-05 17:02:17

标签: c++ winapi createprocess

在这里需要帮助,我正在尝试使用windows api在c ++中创建一个进程,发生的是正在创建的进程是cmd.exe但是我希望cmd.exe在某个目录下打开cd'd即root c:\,但是进程在可执行文件的dir处打开。 我尝试传入“cd \”作为CreateProcess函数的第二个参数无效

以下是代码片段:

TCHAR program[] = TEXT("C:/Windows/System32/cmd.exe");
TCHAR command[] = TEXT("cd /");
STARTUPINFO info;
PROCESS_INFORMATION processInfo;
ZeroMemory(&info,sizeof(STARTUPINFO));
ZeroMemory(&processInfo,sizeof(PROCESS_INFORMATION));

BOOL processResult =
CreateProcess(program,
            command, NULL, NULL,
            TRUE, CREATE_NEW_CONSOLE,
            NULL, NULL,
            &info,
            &processInfo);

if(!processResult){
 std::cerr << "CreateProcess() failed to start program \""
 << program << "\"\n";
 exit(1);
}

std::cout << "Started program \""
<< program << "\" successfully\n";    

非常感谢帮助! 感谢

1 个答案:

答案 0 :(得分:2)

如果希望cd /(或任何其他命令)产生任何影响,则需要在命令提示符下使用/k/c标志。您可以在cmd.exe的文档中查看这些开关,但基本上,/c运行命令然后终止,而/k运行命令并保持控制台会话打开。你几乎肯定想在这里/k

但实际上,您应该将该目录指定为进程的工作目录,而不是执行change-directory命令。

您可以通过调用ShellExecute function轻松完成此操作,正如Raw N建议的那样。工作目录是其参数之一。 ShellExecute(或ShellExecuteEx)比CreateProcess更容易使用,除非您需要一些只能通过CreateProcess获得的特殊低级行为,否则应该首选{。}}。 / p>

这也适用于CreateProcess:将路径作为lpCurrentDirectory参数传递。

无论你做什么,都不要硬编码路径!在Windows NT上使用%comspec%环境变量。它也可以只执行cmd,让默认搜索路径完成它们的工作。