VC中执行dos命令

沼地一萑专门献给群内各位小白的,老白不要偷看,谢谢。
有时候能在vc中执行大家熟悉的dos命令可以少写很多代码,比如共享/取消共享某个文件夹,关闭某个服务,在局域网隐藏本机等等.下面干净利落直接看代码:
(大家看的时候最好是最大化窗口后再看,否则该埋怨我代码写的乱,其实不是,我排的很整齐.)

///
           CString DosString = "net config server /hidden:yes";
           //这个命令是在网上邻居上隐藏本机器 你可以换成你自己感兴趣的dos命令 注意空格千万别错了
          


           ///下面是功能部分 多次使用的话可以封装成函数,当然参数是上面的DosString
           #define DOSCMD (LPTSTR)(LPCTSTR)DosString            
       SECURITY_ATTRIBUTES sa;
       HANDLE hRead,hWrite;
       sa.nLength = sizeof(SECURITY_ATTRIBUTES);
       sa.lpSecurityDescriptor = NULL;
           sa.bInheritHandle = TRUE;
       if (!CreatePipe(&hRead,&hWrite,&sa,0))
       {
        return FALSE;
        //MessageBox("fail Creat Pipe");
       }             
       STARTUPINFO si;
       PROCESS_INFORMATION pi;
       si.cb = sizeof(STARTUPINFO);
       GetStartupInfo(&si);
       si.hStdError = hWrite;
       si.hStdOutput = hWrite;
       si.wShowWindow = SW_HIDE;
       si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;            
       if (!CreateProcess(NULL,DOSCMD,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
       {        
        return FALSE;
        //MessageBox("fail");
       }
       CloseHandle(hWrite);            
       char buffer[4096] = {0};//自己决定缓存大小 别太浪费
       DWORD bytesRead;             
       while (true)
       {
        if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)//buffer中就是执行后的返回结果,可以自己选择处理的方式
        {break;}                
        Sleep(200);
        }     
        

代码不长,直接拷到你程序里好了.            

頂一個,我把他包成function
delay可以用來完整接收ping 順代做timeout

void CRunDlg::runcmd(CString cmd, char *buf, unsigned int bufsize, unsigned int delay)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

if (!CreatePipe(&hRead, &hWrite, &sa, 0)) {
//MessageBox("Create pipe fail");
return;
}

STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, (LPTSTR)(LPCTSTR)cmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, π)) {
//MessageBox("Create process fail");
return;
}
CloseHandle(hWrite);
Sleep(delay);
DWORD bytesRead;
while (TRUE) {
memset(buf, 0, bufsize);
/* If the ReadFile function succeeds, the return value is nonzero. */
if (ReadFile(hRead, buf, bufsize, &bytesRead, NULL) != NULL) {
break;
}
Sleep(200);
}
CloseHandle(hRead);
return;
}

void CRunDlg::OnExec()
{
// TODO: Add your control notification handler code here
CString cmd = "ipconfig";
char *buf;
unsigned int bufsize = 1024;
unsigned int delay = 0;
if ((buf = (char *)malloc(bufsize)) == NULL) {
return;
}

memset(buf, 0, bufsize);
runcmd(cmd, buf, bufsize, delay);
m_opt.Format("%s", buf);
UpdateData(FALSE);
free(buf);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值