【发布时间】:2019-01-10 02:38:25
【问题描述】:
我正在编写一个 WinAPI GUI 程序,该程序需要调用 ftp 和可能的其他控制台程序,同时让它们的控制台输出相应地进行操作。在读取所有输出之前等待 ftp 完成执行是不行的。
我目前的方法是调用 CreateProcess() 创建一个 cmd.exe 进程,该进程可能隐藏丑陋的控制台窗口,AttachConsole() 使其成为我自己的,GetStdHandle() 获取输入和输出句柄, SetConsoleCursorPosition() 到 控制台缓冲区 的末尾,WriteConsole() 使用 ftp\n 或 dir\n 等命令。然而,这个命令被写入但没有被执行。但是,我可以手动使用相同的控制台(使用 CreateProcess() 和 CREATE_NEW_CONSOLE 标志)输入 ftp 按回车键并执行。
之前涉及的方法:
- 直接使用
CreateProcess()调用ftp 并重定向输入/输出。在
CreateProcess()进程结束之前无法获得ftp 输出。 - 使用
system()。在获得任何输出之前被告知不要使用它。
我当前的精简代码:
// Next two structures might be a bit misleading, they were used for the 1. previous
// approach
PROCESS_INFORMATION piProcInfo;
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION));
STARTUPINFO siStartInfo;
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = g_hChildStd_OUT_Wr;
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.hStdInput = g_hChildStd_IN_Rd;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
SECURITY_ATTRIBUTES security;
security.nLength = sizeof(SECURITY_ATTRIBUTES);
security.lpSecurityDescriptor = NULL;
security.bInheritHandle = FALSE;
CreateProcess( NULL, "cmd", &security, &security, FALSE, NORMAL_PRIORITY_CLASS |
CREATE_NEW_CONSOLE, NULL, NULL, &siStartInfo, &piProcInfo);
uint32_t pidConsole = piProcInfo.dwProcessId;
while ( ! AttachConsole(pidConsole) ){};
HANDLE myConsoleIn, myConsoleOut;
myConsoleIn = GetStdHandle(STD_INPUT_HANDLE);
myConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
Sleep(100);
CONSOLE_SCREEN_BUFFER_INFO myConsoleCursorInformation = {};
GetConsoleScreenBufferInfo(myConsoleOut,&myConsoleCursorInformation);
SetConsoleCursorPosition(myConsoleOut,myConsoleCursorInformation.dwSize);
CHAR myConsoleBuffer[200]="dir\n";
DWORD myConsoleProcessed;
WriteConsole( myConsoleOut, myConsoleBuffer, 4, &myConsoleProcessed, NULL);
我怎样才能让写在控制台中的命令执行? 除了我尝试用尾随 \n 结束命令之外,还有其他方法吗? ie。使用 WriteConsole() 带有 dir\n 或 ftp\n 参数。
我考虑在键入所需命令后向相关进程发送按键。然而,创建的控制台不仅需要手动按下回车键,还需要手动输入 dir、ftp 或任何命令。
请随时指出任何遗漏的信息!
【问题讨论】:
标签: c++ winapi c++17 windows-console