学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
 15 12
发新话题
打印

用delphi7怎么调用DOS并显示在label(标签)里??

用delphi7怎么调用DOS并显示在label(标签)里??

我想在一个TEXT控件里输入dos命令 dir c\*.*. 然后按确定后,dos里显示的内容都转到label(标签)里显示,而不是在dos里显示..(界面上有TEXT、BUTTON、LABEL三个控件)
那位高手能帮帮忙写出一个完整的源代码吗?我看了几天网上介绍都看不懂,也不是我想要的结果.

TOP

第一:为什么要用label?用Memo不是更好?
第二:对于内部命令要写成cmd /c dir *.*的格式,Win98是command /c dir *.*,因为内部命令没有对应的可执行文件。

核心代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
    SecurityAttributes : TSecurityAttributes;
    hProcess           : TProcessInformation;
    StartupInfo        : TStartupInfo;
    hReadPipe,hWritePipe : THandle;
    Buff : array [0..256] of char;
    Num : DWORD;
    dwExit:DWORD;
    SendName : String;
    s : String;
begin
    SecurityAttributes.nLength:=Sizeof(SecurityAttributes);
    SecurityAttributes.lpSecurityDescriptor:=nil;
    SecurityAttributes.bInheritHandle:=true;
    CreatePipe(hReadPipe,hWritePipe,@SecurityAttributes,0);
    FillChar(StartupInfo,Sizeof(StartupInfo),#0);
    StartupInfo.cb:=Sizeof(StartupInfo);
    StartupInfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    StartupInfo.wShowWindow:=SW_HIDE;
    StartupInfo.hStdOutput:=hWritePipe;
    StartupInfo.hStdError:=hWritePipe;
    if CreateProcess(nil,PChar(self.Edit1.Text),
                     @SecurityAttributes,
                     @SecurityAttributes,
                     true,0,nil,nil,
                     StartupInfo,
                     hProcess) then
    begin
        CloseHandle(hProcess.hThread);
        WaitForSingleObject(hProcess.hProcess,INFINITE);
        GetExitCodeProcess(hProcess.hProcess,dwExit);
        CloseHandle(hProcess.hProcess);
        CloseHandle(hWritePipe);
        Num:=0; s:='';
        while ReadFile(hReadPipe,Buff,256,Num,nil) do
        begin
            Buff[Num]:=#0;
            s:=s+Buff;
        end;
        CloseHandle(hReadPipe);
        //
        self.Label1.Caption:=s;
    end
    else
        MessageBox(self.Handle,PChar('调用命令 '+self.Edit1.Text+' 失败!'),'调用失败',MB_OK or MB_ICONWARNING);
end;

TOP

谢谢楼上的高手.至于用LABEL还是MEMO,是个人喜欢,我是个新手只知道LABEL可以显示,还没有懂得别的控件可用呢.
那你就改用MEMO吧.
可是我在TEXT里输入DIR.结果是'调用DIR失败'
问题出在哪?

TOP

设置label1的AutoSize属性为false,WordWrap属性为true.

procedure TForm1.Button1Click(Sender: TObject);
var
  cmd:string;
  tmp:integer;
  buffer:array [0..1000]of char;
begin
  cmd:=edit1.Text;
  winexec(pchar('cmd /c '+cmd+' >tmp.tmp'),sw_hide);
  sleep(100);//如果要执行的命令比较耗时,请设置一定的等待时间.(内部命令不必...)
  tmp:=fileopen('tmp.tmp',fmOpenReadWrite);
  fileread(tmp,buffer,sizeof(buffer));
  label1.Caption:=buffer;
  fileclose(tmp);
end;

TOP

用memo控件的话更简单:
procedure TForm1.Button1Click(Sender: TObject);
var
  cmd:string;
begin
  cmd:=edit1.Text;
  winexec(pchar('cmd /c '+cmd+' >tmp.tmp'),sw_hide);
  sleep(100);
  memo1.Lines.LoadFromFile('tmp.tmp');
end;

TOP

引用:
以下是引用 lfkm 在 2008-4-19 20:45 的发言:

谢谢楼上的高手.至于用LABEL还是MEMO,是个人喜欢,我是个新手只知道LABEL可以显示,还没有懂得别的控件可用呢.
那你就改用MEMO吧.
可是我在TEXT里输入DIR.结果是'调用DIR失败'
问题出在哪? ...
要输入:cmd /c dir

TOP

引用:
以下是引用 yeye55 在 2008-4-19 22:17 的发言:



要输入:cmd /c dir
好像只对存放delphi文件路径有用.我把CMD /C DIR改为CMD /F DIR就看存放该文件路径了.
CMD /C DIR中的/C是不是C盘?

TOP

引用:
以下是引用 DreamHK 在 2008-4-19 21:45 的发言:

设置label1的AutoSize属性为false,WordWrap属性为true.

procedure TForm1.Button1Click(Sender: TObject);
var
  cmd:string;
  tmp:integer;
  buffer:array [0..1000]of char;
begin
  cmd:=edit1.Text;
  winexe ...
这方法对用DIR很合我意思了..哈哈..只是我再用ipconfig想查下IP就要等好久和狂按按钮才看它一闪而过,为什么会这样呢?

TOP

引用:
以下是引用 DreamHK 在 2008-4-19 21:49 的发言:

用memo控件的话更简单:
procedure TForm1.Button1Click(Sender: TObject);
var
  cmd:string;
begin
  cmd:=edit1.Text;
  winexec(pchar('cmd /c '+cmd+' >tmp.tmp'),sw_hide);
  sleep(100);
  memo1.Lines.LoadFr ...
用这个使用ipconfig就直接报错.说有另一个程序在使用它之类的.
不过还是谢谢高手了..哈哈...解决一个又出来一个...

TOP

引用:
以下是引用 lfkm 在 2008-4-20 01:22 的发言:


好像只对存放delphi文件路径有用.我把CMD /C DIR改为CMD /F DIR就看存放该文件路径了.
CMD /C DIR中的/C是不是C盘?
cmd 是启动命令行的意思,/c 的意思是启动命令行后执行随后的命令,dir 是一个内部命令,例如:查看F盘根目录就要输入 cmd /c dir f:\

ipconfig 是一个外部命令,外部命令是以一个单独的可执行文件形式存放,ipconfig.exe 位于C:\WINNT\system32文件夹下,调用外部命令可以直接输入命令,例如:输入 ipconfig /all

TOP

 15 12
发新话题