永发信息网

关于VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果

答案:2  悬赏:0  手机版
解决时间 2021-02-06 04:52
  • 提问者网友:听门外雪花风
  • 2021-02-06 01:41
BOOL CDOSDlg::ExecDosCmd()
{
TCHAR szCmdLine[] = _T("cmd.exe /c dir c:\\windows");//不要使用宏定义,那样如果是unicode版本的话CreateProcess会失败

SECURITY_ATTRIBUTES sa = {0};
HANDLE hRead = NULL, hWrite = NULL;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa,0))
{
return FALSE;
}

STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
bool res=CreateProcess(NULL, szCmdLine,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);
if (!res)
{
return FALSE;
}
if(TRUE==res)
{
//等待进程执行完毕
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
} CloseHandle(hWrite);

char buffer[4096] = {0};
DWORD bytesRead = 0;
while (true)
{
if ( !ReadFile(hRead, buffer, 4095, &bytesRead, NULL) )
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
TRACE(buffer);
Sleep(200);
}
return TRUE;
}

问题是:我执行批处理文件时,数据大于4095(4K),我改写了:char buffer[512000],然后ReadFile(hRead, buffer, 511999, &bytesRead, NULL)在但实际上总是只能读到4K的数据。

而且数据一大于4K,程序就卡死,运行不下去。
最佳答案
  • 五星知识达人网友:未来江山和你
  • 2021-02-06 02:20
你这个while是可能会导致死循环的
if ( !ReadFile(hRead, buffer, 4095, &bytesRead, NULL) )
break;

因为ReadFile 在读到文件末尾时,有时候返回值并不为0;

正确的做法是判断bytesRead的值,当为0时,才表示读完文件了!
全部回答
  • 1楼网友:末日狂欢
  • 2021-02-06 02:36
同问。。。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯