您的位置:首页 > 其它

VC中执行dos命令

2010-01-21 23:59 253 查看
沼地一萑专门献给群内各位小白的,老白不要偷看,谢谢。

有时候能在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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: