win10里用MFC获取命令行程序运行时的信息时出现“拒绝访问”的问题

来源:互联网 发布:房地产运营知乎 编辑:程序博客网 时间:2024/05/16 17:41

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


0 0
原创粉丝点击