最近想要用MFC写程序来实现软件数据与服务器数据的同步,用CreatePipe和ReadFile来执行cmd命令并读取显示信息。
用的程序如下:
void CTestMFCDlg::ExecuteCmd(unsigned int CmdType, CString strCmd, CString *strOutput) { // TODO: Add extra validation here SECURITY_ATTRIBUTES sa; HANDLE hRead, hWrite; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { MessageBox(_T("CreatePipe Failed")); return ; } STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; TCHAR* cmdline = StringToChar(strCmd); if (!CreateProcess(NULL, cmdline, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) { MessageBox(_T("CreateProcess failed!")); return ; } CloseHandle(hWrite); char buffer[4096] = { 0 }; CString strTmp; DWORD bytesRead; while (1) { if (NULL == ReadFile(hRead, buffer, 4095, &bytesRead, NULL)) { break; } if(UNIX_CMD == CmdType) { UTF8Text2CString(strTmp, buffer); strTmp.Replace(_T("\n"), _T("\r\n")); } else { strTmp += buffer; } *strOutput += strTmp; SetDlgItemText(IDC_EDIT_TEXT, *strOutput); UpdateWindow(); Sleep(1000); } int CharPst; if (( CharPst = strTmp.FindOneOf( _T( "total" ) ) != -1 )); CloseHandle(hRead); }在程序运行的界面如下:
运行后却显示“拒绝访问”的提示信息。
想了很久觉得应该是权限的问题,于是首先修改了debug里面的运行程序的执行权限,即默认以管理员的身份运行(具体可自己百度一下)。然后打开VS编译,又发现VS的权限不够,后来又把VS的执行权限给改了,也是以管理员的身份运行,然后问题完美解决。