最近想要用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的执行权限给改了,也是以管理员的身份运行,然后问题完美解决。