请专大家帮我看看这个执行dos命令的程序

ling1980 2008-11-18 10:44:20
BOOL CDOSDlg::ExecDosCmd()
{
#define EXECDOSCMD "ping www.163.com" //可以换成你的命令

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;
}

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;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcess(NULL, EXECDOSCMD
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
return FALSE;
}
CloseHandle(hWrite);

char buffer[4096] = {0};
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
TRACE(buffer);
Sleep(200);
}
return TRUE;
}

如果把"ping www.163.com"改成"cmd.exe /c dir c:\\windows"
得到的目录列表不对,还有乱符
请帮帮我
...全文
1098 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ling1980 2008-11-22
  • 打赏
  • 举报
回复
楼上的你是怎么输出到一个CEdit上的?
我输出到CEdit上也是错误的
m_Edit.ReplaceSel(_T(buffer));
gamezealot 2008-11-19
  • 打赏
  • 举报
回复
另外注意一点:你所用的TRACE不能正确显示结果,所以上面显示的结果好像不对,其实是对的,写入到文件中是没有问题的。如下面:
ofstream os( "test.txt" );
while (true)
{
if ( !ReadFile(hRead, buffer, 4095, &bytesRead, NULL) )
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
TRACE(buffer);
os.write(buffer, bytesRead);
Sleep(200);
}
结果里面有时候会有一些退格backspaces,我们应该将它们转换成空格space,这样就不会有问题了。
详细你可以看这个例子,做的很好。
http://www.vckbase.com/english/code/misc/redirect.shtml.htm
hellward 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gamezealot 的回复:]
//看了你的程序,做以下修改即可。
BOOL CDOSDlg::ExecDosCmd()
{
TCHAR szCmdLine[] = _T("cmd.exe /c dir c:\\windows");//不要使用宏定义,那样如果是unicode版本的话CreateProcess会失败
#define EXECDOSCMD _T("cmd.exe /c dir c:\\windows")    //可以换成你的命令

SECURITY_ATTRIBUTES sa = {0};
HANDLE hRead = NULL, hWrite = NULL;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = …
[/Quote]
很好很强大!
sys0005 2008-11-19
  • 打赏
  • 举报
回复
我的测试也正常。


while (true)
{
ZeroMemory(buffer, 4095);
if ( !ReadFile(hRead, buffer, 4095, &bytesRead, NULL) )
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
TRACE(buffer);
Sleep(200);
}
gamezealot 2008-11-19
  • 打赏
  • 举报
回复
//看了你的程序,做以下修改即可。
BOOL CDOSDlg::ExecDosCmd()
{
TCHAR szCmdLine[] = _T("cmd.exe /c dir c:\\windows");//不要使用宏定义,那样如果是unicode版本的话CreateProcess会失败
#define EXECDOSCMD _T("cmd.exe /c dir c:\\windows") //可以换成你的命令

SECURITY_ATTRIBUTES sa = {0};
HANDLE hRead = NULL, hWrite = NULL;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa,0))
{
return FALSE;
}

STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcess(NULL, szCmdLine
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
return FALSE;
}
CloseHandle(hWrite);

char buffer[4096] = {0};
DWORD bytesRead = 0;
while (true)
{
if ( !ReadFile(hRead, buffer, 4095, &bytesRead, NULL) )
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
TRACE(buffer);
Sleep(200);
}
return TRUE;
}
再者就是注意变量一定要初始化,这个很有可能是引起你乱码的原因。我使用vc2005,多字节及unicode编译下输出结果为。很正常:
驱动器 C 中的卷是 系统空间
卷的序列号是 D061-BC47

c:\windows 的目录

2008-11-18 21:50 <DIR> .
2008-11-18 21:50 <DIR> ..
2008-11-18 21:51 0 0.log
2008-07-19 21:57 <DIR> addins
2008-11-01 12:24 <DIR> AppPatch
2008-07-20 01:04 8,982 bcmwl.log
2004-08-17 19:00 1,272 Blue Lace 16.bmp
2004-08-17 19:00 82,944 clock.avi
2008-07-19 14:13 200 cmsetacl.log
2004-08-17 19:00 17,062 Coffee Bean.bmp
2008-11-01 15:55 1,084 COM+.log
2008-11-13 21:34 111,532 comsetup.log
2008-07-19 21:57 <DIR> Config
2008-07-19 21:57 <DIR> Connection Wizard
2008-07-19 14:18 0 control.ini
2008-07-19 14:15 <DIR> Cursors
2008-11-04 22:58 <DIR> Debug
2004-08-17 19:00 2 desktop.ini
2008-11-01 14:26 86,074 DirectX.log
2008-11-01 14:28 15,402 DirectX_SDK.log
21,405 MedCtrOC.log
2008-11-01 13:08 <DIR> Media
2008-11-04 23:07 <DIR> Microsoft.NET
2008-07-19 22:02 <DIR> msagent
2008-07-19 21:57 <DIR> msapps
2008-11-01 12:28 16,695 MSCompPackV1.log
2004-08-17 19:00 1,405 msdfmap.ini
2008-11-13 21:34 15,086 msgsocm.log
2008-11-13 21:34 103,000 msmqinst.log
2008-11-01 16:13 279,066 msxml4-KB936181-chs.LOG
2008-11-13 21:34 301,498 msxml4-KB954430-chs.LOG
2008-07-19 21:57 <DIR> mui
2008-11-13 21:34 52,603 netfxocm.log
2008-07-19 22:03 <DIR> Network Diagnostic
2008-07-19 21:57 <DIR> NLDRV
2008-11-01 13:07 9,576 NLSDownlevelMapping.log
2008-04-13 17:14 66,560 NOTEPAD.EXE
2008-11-13 21:34 66,863 ntdtcsetup.log
2008-11-13 21:34 171,790 ocgen.log
2008-11-13 21:34 18,754 ocmsn.log
2008-11-01 14:56 774 ODBC.INI
-01 12:31 43,520 WMFDist11.log
2008-11-01 12:32 32,760 wmp11.log
2004-08-17 19:00 20,212 wmprfCHS.prx
2008-11-16 22:36 5,410 wmsetup.log
2008-11-16 22:36 540 wmsetup10.log
2008-07-19 14:18 316,640 WMSysPr9.prx
2008-11-01 12:28 29,856 Wudf01000Inst.log
2004-08-17 19:00 9,522 Zapotec.bmp
2004-08-17 19:00 707 _default.pif
129 个文件 10,607,957 字节
45 个目录 12,736,684,032 可用字节
-19 21:57 <DIR> mui
2008-11-13 21:34 52,603 netfxocm.log
2008-07-19 22:03 <DIR> Network Diagnostic
2008-07-19 21:57 <DIR> NLDRV
2008-11-01 13:07 9,576 NLSDownlevelMapping.log
2008-04-13 17:14 66,560 NOTEPAD.EXE
2008-11-13 21:34 66,863 ntdtcsetup.log
2008-11-13 21:34 171,790 ocgen.log
2008-11-13 21:34 18,754 ocmsn.log
2008-11-01 14:56 774 ODBC.INI
The program '[3208] test.exe: Native' has exited with code 0 (0x0).
gamezealot 2008-11-19
  • 打赏
  • 举报
回复
你说的是那里显示不对?debug output窗口吗?那个用TRACE输出的确实有问题,不知道为什么。但buffer内容确实没问题。我将之输出到一个CEdit上,目录也没问题。
ling1980 2008-11-19
  • 打赏
  • 举报
回复
目录显示的不对
dbger 2008-11-19
  • 打赏
  • 举报
回复
测试没问题。
ling1980 2008-11-19
  • 打赏
  • 举报
回复
还是不能正确显示,请问这是为什么,有解决方法吗
难道必须先保存到文件再从文件读出来

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧