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

最近想要用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值