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);
}
有时候能在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);
}
相关文章推荐
- 在VC下执行DOS命令
- 在VC下执行DOS命令
- VC 执行DOS命令 管道
- 在VC下执行DOS命令
- 在VC下执行DOS命令(VC执行EXE)
- 在.net中悄悄执行dos命令,并获取执行的结果
- C/C++中一次性执行多个DOS命令
- 执行DOS命令不再一闪而过
- java也可以执行dos 命令
- dos里执行tracert命令只有一跳的原因及解决方法
- 对python中执行DOS命令的3种方法总结
- dos命令下执行命令报错 错误:程序包org.dom4j.jar不存在 错误:找不到符号处理
- dos延迟执行命令
- dos命令执行mysql的sql文件
- C#执行dos里面的命令的方法,在Web中使用,比如ping,ipconfig等
- VC下如何调用控制台命令以及其他可执行文件
- 执行dos命令而不显示界面
- 使用C#调用外部序或是执行DOS命令
- dos中for in后面执行多个命令的方法
- VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果