CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  网络及通讯开发

请问:如果我在程序中调用了一个比如说dir的命令会出现一个dos窗口,如何不让出现dos窗口而把信息给传到我程序中的memo控件当中呢

楼主firestars(烦)2003-12-01 15:52:26 在 C++ Builder / 网络及通讯开发 提问

rt多谢 问题点数:0、回复次数:12Top

1 楼ccrun(老妖)(www.ccrun.com)回复于 2003-12-01 16:11:31 得分 0

CBuilder中使用管道技术实例         pp616(原作)      
       
  关键字           管道    
       
   
   
  废话不多说,大家来看代码  
   
  bool   __fastcall   TForm1::RunCmd(AnsiString   cmd,TStringList   *stringlist)  
  {  
          TMemoryStream   *memstream=new   TMemoryStream();  
          AnsiString   rn="\\r\\n";  
          PROCESS_INFORMATION   proc;  
          STARTUPINFO   start;  
          SECURITY_ATTRIBUTES   sa;  
          long   ret;  
          unsigned   long   lngBytesread;  
          HANDLE   hReadPipe,hWritePipe;  
          char   *strBuff=(char   *)malloc(256);  
          if(strBuff==NULL)  
          {  
                  return   false;  
          }  
          sa.nLength   =   sizeof(SECURITY_ATTRIBUTES);  
          sa.bInheritHandle=true;  
          sa.lpSecurityDescriptor=NULL;  
          ret=CreatePipe(&hReadPipe,&hWritePipe,&sa,0);  
          if(ret==0)  
          {  
                  //创建管道失败  
                  return   false;  
          }  
          memset(&start,0x00,sizeof(STARTUPINFO));  
          start.cb=sizeof(STARTUPINFO);  
          start.dwFlags=STARTF_USESTDHANDLES   |   STARTF_USESHOWWINDOW;  
          start.hStdOutput=hWritePipe;  
          start.hStdError=hWritePipe;  
          bool   retc=CreateProcess(NULL,cmd.c_str(),NULL,NULL,true,   0,   0,   NULL,   &start,   &proc);  
          if(!retc)  
          {  
                  return   false;  
          }  
          CloseHandle(hWritePipe);  
          unsigned   long   len;  
          memstream->Position=0;  
          while(true)  
          {  
                  memset(strBuff,0x00,256);  
                  GetFileSize(hReadPipe,&len);  
                  ret   =   ReadFile(hReadPipe,   strBuff,   256,   &lngBytesread,NULL);  
                  if(ret==0)  
                  {  
                          break;  
                  }  
                  else  
                  {  
                          memstream->Write(strBuff,lngBytesread);  
                  }  
          }  
          CloseHandle(proc.hProcess);  
          CloseHandle(proc.hThread);  
          CloseHandle(hReadPipe);  
          memstream->Position=0;  
          free(strBuff);  
          stringlist->LoadFromStream(memstream);  
          memstream->Clear();  
          delete   memstream;  
          return   true;  
  }  
   
  以上为一个使用管道获取命令行模式的程序的运行结果的函数。  
   
  使用代码  
   
  TStringList   *StrList=new   TStringList;  
  AnsiString   strcmd;  
   
  RunCmd(strcmd,StrList);  
   
  结果保留再StrList中。  
     
  Top

2 楼warton(创业群13734424 http://www.anywhy.cn)回复于 2003-12-01 19:01:26 得分 0

好!  
  对了,像dir这样的命令,运行:dir/cmd   dir/cmd   dir   c:好像都不行?命令行该怎么写?Top

3 楼pp616(坏蛋)回复于 2003-12-01 19:53:14 得分 0

嘻嘻。是我写的哎。Top

4 楼pp616(坏蛋)回复于 2003-12-01 20:05:23 得分 0

ms   的内部命令好象不能用CreateProcess来创建啊。  
  不过dir命令可以用FindFirstFile   FindNextFile   FindClose来做。  
   
  Top

5 楼matq2008(叶子.net)回复于 2003-12-01 21:04:03 得分 0

执行:   dir   >your.txt就行了  
  结果在your.txt文件中Top

6 楼pp616(坏蛋)回复于 2003-12-01 21:05:51 得分 0

那需要一个临时文件啊。要是用管道就不需要用临时文件了。Top

7 楼matq2008(叶子.net)回复于 2003-12-01 22:24:37 得分 0

看看vc写:  
  *    
  *   通过管道技术,将dir   /?的帮助信息输入到MFC应用程序的一个CEdit控件中。    
  *   VC++6.0   +   WinXP   通过    
  *    
  *   detrox,   2003    
  */    
   
  void   CPipeDlg::OnButton1()    
  {    
          SECURITY_ATTRIBUTES   sa;    
          HANDLE   hRead,hWrite;    
   
          sa.nLength   =   sizeof(SECURITY_ATTRIBUTES);    
          sa.lpSecurityDescriptor   =   NULL;    
          sa.bInheritHandle   =   TRUE;    
          if   (!CreatePipe(&hRead,&hWrite,&sa,0))  
          {    
              MessageBox("Error   On   CreatePipe()");    
              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,"c:\\windows\\system32\\cmd.exe/c   dir   /?"   ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))  
          {    
                  MessageBox("Error   on   CreateProcess()");    
                  return;    
          }    
          CloseHandle(hWrite);    
   
          char   buffer[4096]   =   {0};    
          DWORD   bytesRead;    
          while   (true)  
          {    
                  if   (ReadFile(hRead,buffer,4095,&bytesRead,NULL)   ==   NULL)    
                          break;    
                  m_Edit1   +=   buffer;    
                  UpdateData(false);    
                  Sleep(200);    
          }    
  }Top

8 楼pp616(坏蛋)回复于 2003-12-01 23:58:44 得分 0

哦。学到了。原来是用cmd   的参数/c  
   
  TStringList   *StrList=new   TStringList;  
  AnsiString   strcmd="cmd.exe   /c   dir";  
  RunCmd(strcmd,StrList);  
  这就好了。  
  Top

9 楼myy()回复于 2003-12-02 00:09:46 得分 0

启动   Windows   2000   命令解释器一个新的实例  
   
  CMD   [/A   |   /U]   [/Q]   [/D]   [/E:ON   |   /E:OFF]   [/F:ON   |   /F:OFF]   [/V:ON   |   /V:OFF]  
          [[/S]   [/C   |   /K]   string]  
   
  /C             执行字符串指定的命令然后终断  
  /K             执行字符串指定的命令但保留  
  /S             在   /C   或   /K   后修改字符串处理(见下)  
  /Q             关闭回应  
  /D             从注册表中停用执行   AutoRun   命令(见下)  
  /A             使向内部管道或文件命令的输出成为   ANSI  
  /U             使向内部管道或文件命令的输出成为   Unicode  
  /T:fg       设置前景/背景颜色(详细信息,请见   COLOR   /?)  
  /E:ON       启用命令扩展(见下)  
  /E:OFF     停用命令扩展(见下)  
  /F:ON       启用文件和目录名称完成字符   (见下)  
  /F:OFF     停用文件和目录名称完成字符(见下)  
  /V:ON       将   c   作为定界符启动延缓环境变量扩展。如:   /V:ON   会  
                  允许   !var!   在执行时允许   !var!   扩展变量   var。var   语法  
                  在输入时扩展变量,这与在一个   FOR   循环内不同。  
  /V:OFF     停用延缓的环境扩展。  
   
  请注意,如果字符串有引号,可以接受用命令分隔符   '&&'   隔开  
  的多个命令。并且,由于兼容原因,/X   与   /E:ON   相同,/Y   与  
  /E:OFF   相同,并且   /R   与   /C   相同。忽略任何其它命令选项。  
   
  如果指定了   /C   或   /K,命令选项后的命令行其余部分将作为命令行处  
  理;在这种情况下,会使用下列逻辑处理引号字符("):  
   
          1.       如果符合下列所有条件,那么在命令行上的引号字符将被  
                  保留:  
   
                  -   不带   /S   命令选项  
                  -   整整两个引号字符  
                  -   在两个引号字符之间没有特殊字符,特殊字符为下列中的  
                      一个:   <>()@^|  
                  -   在两个引号字符之间有至少一个空白字符  
                  -   在两个引号字符之间有至少一个可执行文件的名称。  
   
          2.     否则,老办法是,看第一个字符是否是一个引号字符,如果  
                  是,舍去开头的字符并删除命令行上   的最后一个引号字符,  
                  保留最后一个引号字符之后的文字。  
   
  如果   /D   未在命令行上被指定,当   CMD.EXE   开始时,它会寻找  
  以下   REG_SZ/REG_EXPAND_SZ   注册表变量。如果其中一个或  
  两个都存在,这两个变量会先被执行。  
   
          HKEY_LOCAL_MACHINE\Software\Microsoft\Command   Processor\AutoRun  
   
                  和/或  
   
          HKEY_CURRENT_USER\Software\Microsoft\Command   Processor\AutoRun  
   
  命令扩展是按默认值启用的。您也可以使用   /E:OFF,为某一  
  特定调用而停用扩展。您可以在机器上和/或用户登录会话上  
  启用或停用   CMD.EXE   所有调用的扩展,这要通过设置使用  
  REGEDT32.EXE   的注册表中的一个或两个   REG_DWORD   值:  
   
          HKEY_LOCAL_MACHINE\Software\Microsoft\Command   Processor\EnableExtensions  
   
                  和/或  
   
          HKEY_CURRENT_USER\Software\Microsoft\Command   Processor\EnableExtensions  
   
  到   0x1   或   0x0。     用户特定设置比机器设置有优先权。命令行  
  命令选项比注册表设置有优先权。  
   
  命令行扩展包括对下列命令所做的更改和/或添加:  
   
          DEL   或   ERASE  
          COLOR  
          CD   或   CHDIR  
          MD   或   MKDIR  
          PROMPT  
          PUSHD  
          POPD  
          SET  
          SETLOCAL  
          ENDLOCAL  
          IF  
          FOR  
          CALL  
          SHIFT  
          GOTO  
          START   (同时包括对外部命令调用所做的更改)  
          ASSOC  
          FTYPE  
   
  有关详细信息,请键入   HELP   命令名。  
   
  延迟变量环境扩展不按默认值启用。您可以用/V:ON或   /V:OFF  
  命令选项,为   CMD.EXE   的某个调用而启用或停用延迟环境变量扩充。  
  您可以在机器上和/或用户登录会话上启用或停用   CMD.EXE   所有  
  调用的完成,这要通过设置使用   REGEDT32.EXE   的注册表中的  
  一个或两个   REG_DWORD   值:  
   
          HKEY_LOCAL_MACHINE\Software\Microsoft\Command   Processor\DelayedExpansion  
   
                  和/或  
   
          HKEY_CURRENT_USER\Software\Microsoft\Command   Processor\DelayedExpansion  
   
  到   0x1   或   0x0。     用户特定设置比机器设置有优先权。命令行命令选项  
  比注册表设置有优先权。  
   
  如果延迟环境变量扩充被启用,惊叹号字符可在执行时间,被用来  
  代替一个环境变量的数值。  
   
  文件和目录名完成不按默认值启用。您可以用   /F:ON   或   /F:OFF  
  命令选项,为   CMD.EXE   的某个调用而启用或停用文件名完成。   您可以  
  在机器上和/或用户登录会话上启用或停用   CMD.EXE   所有调用的  
  完成,这要通过设置使用   REGEDT32.EXE   的注册表中的一个或两个  
  REG_DWORD   值:  
   
          HKEY_LOCAL_MACHINE\Software\Microsoft\Command   Processor\CompletionChar  
          HKEY_LOCAL_MACHINE\Software\Microsoft\Command   Processor\PathCompletionChar  
   
                  和/或  
   
          HKEY_CURRENT_USER\Software\Microsoft\Command   Processor\CompletionChar  
          HKEY_CURRENT_USER\Software\Microsoft\Command   Processor\PathCompletionChar  
   
  由一个控制字符的十六进制值作为一个特定参数(例如,0x4   是  
  Ctrl-D,0x6   是   Ctrl-F)。   用户特定设置优先于机器设置。命令行  
  命令选项优先于注册表设置。  
   
  如果完成是用   /F:ON   命令选项启用的,两个要使用的控制符是:   目录名  
  字完成用   Ctrl-D,   文件名完成用   Ctrl-F。   要停用注册表中的某个  
  字符,请用空格   (0x20)   的数值,因为此字符不是控制字符。  
   
  如果键入两个控制字符中的一个,完成会被调用。完成功能将  
  路径字符长带到光标的左边,如果没有通配符,将通配符附加  
  到左边,并建立相符的路径列表。然后,显示第一个相符的路  
  径。如果没有相符的路径,则发出嘟嘟声,不影响显示。之后,  
  重复按同一个控制字符会循环显示相符路径的列表。将   Shift   键  
  跟控制字符同时按下,会倒着显示列表。如果对该行进行了任  
  何编辑,并再次按下控制字符,保存的相符路径的列表会被丢弃,  
  新的会被生成。如果在文件和目录名完成之间命令选项,会发生  
  同样现象。两个控制字符之间的唯一区别是文件完成字符符合  
  文件和目录名,而目录完成字符只符合目录名。如果文件完成  
  被用于内置式目录命令(CD,   MD   或   RD),就会使用目录完成。  
   
  将引号将相符路径括起来,完成代码可以正确处理含有空格  
  或其它特殊字符的文件名。同时,如果备份,然后从行内调用  
  文件完成,完成被调用是位于光标右方的文字会被丢弃。  
  Top

10 楼ccrun(老妖)(www.ccrun.com)回复于 2003-12-02 08:42:12 得分 0

嘿嘿,跟着pp616又学一招。Top

11 楼warton(创业群13734424 http://www.anywhy.cn)回复于 2003-12-02 15:32:45 得分 0

嗯,好贴子,记得加入FAQ哦!Top

12 楼penu(懒猫·子在川上之再上征程·杀人无心之寓怒于静)回复于 2003-12-02 15:40:39 得分 0

哈,我从来都是用类似dir>xxx.txt然后读xxx.txt的方法,又简单又好用。Top

相关问题

  • VB控件调用,急!
  • 控件调用问题~~
  • 怎么调用MSINET控件?
  • 控件调用问题
  • 关于html控件调用
  • memo控件
  • 如何调用控件组的代码?
  • servlet能调用Activex控件吗?
  • 怎样用SDK调用List View控件
  • 关于调用控件(特急)

关键词

  • 字符
  • 命令行
  • 选项
  • 扩展
  • 文件
  • 执行
  • 命令
  • 调用
  • 引号
  • 停用

得分解答快速导航

  • 帖主:firestars

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo