本文着重解决3个问题:
1 类似cmd的功能
2 同时执行执行多命令:“cmd /k + 命令”
3 重定向console的输出,以达到利用console来显示操作信息的目的。
存在bug:执行命令时,点console屏幕右上角关闭,会导致程序出错。
此处偷懒,就没有只是假设发送命令:cd D:
通过argv参数,则可以实现类似cmd的扩展功能。
bool g_bIsRun = false; void runcmd(CString cmd, char *buf, unsigned int bufsize, unsigned int delay); int main() { int delay = 0; char szCmd[1024] = {0}; char *pszBuf = NULL; pszBuf = (char *)calloc(10240,sizeof(char)); if(!g_bIsRun) { g_bIsRun = true; AllocConsole(); freopen("CONOUT$","w+t",stdout); freopen("CONIN$","r+t",stdin); } sprintf(szCmd,"cd D:"); runcmd(szCmd, pszBuf, 10240, delay); if(pszBuf != NULL) delete [] pszBuf; if(g_bIsRun) FreeConsole(); return 0; }
void runcmd(CString cmd, char *buf, unsigned int bufsize, unsigned int delay) { SECURITY_ATTRIBUTES sa; HANDLE hRead, hWrite; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { printf("创建通讯管道失败\n"); return; } STARTUPINFO si; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; if (!CreateProcess(NULL, (LPTSTR)(LPCTSTR)cmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) { printf("启动进程失败\n"); return; } CloseHandle(hWrite); DWORD bytesRead; DWORD dwFlg = NULL; do{ memset(buf, 0, bufsize); dwFlg = WaitForSingleObject(pi.hProcess, 300); ReadFile(hRead, buf, bufsize, &bytesRead, NULL); printf(buf); }while(dwFlg == WAIT_TIMEOUT); CloseHandle(hRead); return; }