当你需要调用命令行程序,并获取它的命令行输出内容的时候,这个函数就可以满足你的需要。
String ExecDosCmd(String cmd, TMemo *memo)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return FALSE;
}
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;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcess(NULL, cmd.c_str(), NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
DWORD bytesRead;
String strOutPut = "";
while(true)
{
if(ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
//printf(buffer);
strOutPut += buffer;
Sleep(200);
memo->Text = strOutPut;
}
return strOutPut;
}
但是我再实际使用过程中,遇到个问题:
有些控制台应用,不是一条条的打印信息。而是修改控制台上已经显示的内容。这种控制台程序,我还没有弄清楚怎么解决。
C++ Builder:调用命令行并捕获输出
本文介绍如何在C++ Builder中调用外部命令行程序并获取其输出内容。然而,对于那些修改已有控制台内容而非逐行输出的程序,目前尚未找到解决方案。
1739

被折叠的 条评论
为什么被折叠?



