如何/何时可以使用返回的CreateProcess的dwProcessId AttachConsole

时间:2013-05-29 06:31:19

标签: winapi console createprocess windows-console

我想在Windows中编写一个控制台模拟器。我需要从GUI应用程序启动cmd.exe(使用SW_HIDE),然后使用AttachConsole启动它。

// cmdline is a writable L"cmd"
// start_info contains a SW_HIDE
PROCESS_INFORMATION proc_info;
CreateProcess(NULL, cmdline, NULL, NULL, false, 0, NULL, NULL, &start_info, &proc_info);
AttachConsole(proc_info.dwProcessId);

但AttachConsole失败并显示ERROR_GEN_FAILURE(31),表示"the specified process does not exist"

似乎当CreateProcess返回时,cmd.exe的控制台尚未完全初始化,因为在AttachConsole解决问题之前添加Sleep(100);

那么我怎么能等到我可以在没有睡觉随机数的情况下使用AttachConsole?

2 个答案:

答案 0 :(得分:0)

可能你可以编写一个与之通信的帮助控制台应用程序。它可以在主应用程序启动时发出信号(此时它的控制台将被创建)。主应用程序可以告诉助手什么/如何产生“真正的”儿童控制台应用程序。如果用C语言编写没有默认库,那么帮助程序最终可能只有几KB大,而不是很多开销。

答案 1 :(得分:0)

您可以在AttachConsole返回ERROR_GEN_FAILURE

时循环