沼地一萑专门献给群内各位小白的,老白不要偷看,谢谢。
有时候能在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);
}