沼地一萑专门献给群内各位小白的,老白不要偷看,谢谢。
有时候能在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);
        }     
        
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
代码不长,直接拷到你程序里好了.                          
                                                                

Feedback

# re: 在vc中执行dos命令--『原著:獾兄』  回复  更多评论   

2007-04-16 23:01 by 迷失的小熊
嗯,无意中看到你这个帖子,
刚好借鉴了2行程序用到我的程序里。
真的很感激。
多谢了。

# re: 在vc中执行dos命令--『原著:獾兄』  回复  更多评论   

2007-07-02 15:49 by 好方法
頂一個,我把他包成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);
}

# re: 在vc中执行dos命令--『原著:獾兄』  回复  更多评论   

2007-08-07 15:15 by yongshengfree
就是执行速度有点儿慢,不知道有没有办法提高提高。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理