起因是这样的。 
我在公司使用SIPp进行测试,它是命令行的工具。 
我在同一台机器上,需要运行2个SIPp,一个作为UAS,一个作为UAC。 有没有什么办法,把cmd这个程序,弄成类似IE7或Maxthon,或者SecureCRT那样的多Table界面?

解决方案 »

  1.   

    给你一个函数,可以执行DOS命令,并返回结果
    function GetDosOutput(Command: string): string;
    var
      hReadPipe : THandle;
      hWritePipe : THandle;
      SI : TStartUpInfo;
      PI : TProcessInformation;
      SA : TSecurityAttributes;
      BytesRead : DWORD;
      Dest : array[0..32767] of char;
      CmdLine : array[0..512] of char;
      Avail, ExitCode, wrResult : DWORD;
      osVer : TOSVERSIONINFO;
      tmpstr :AnsiString;
      Line: String;
    begin
      osVer.dwOSVersionInfoSize := Sizeof(TOSVERSIONINFO);
      GetVersionEX(osVer);
      if osVer.dwPlatformId = VER_PLATFORM_WIN32_NT then
      begin
        SA.nLength := SizeOf(SA);
        SA.lpSecurityDescriptor := nil;
        SA.bInheritHandle := True;
        CreatePipe(hReadPipe, hWritePipe, @SA, 0);
      end
      else
        CreatePipe(hReadPipe, hWritePipe, nil, 1024);
      try
        FillChar(SI, SizeOf(SI), 0);
        SI.cb := SizeOf(TStartUpInfo);
        SI.wShowWindow := SW_HIDE;
        SI.dwFlags := STARTF_USESHOWWINDOW;
        SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
        SI.hStdOutput := hWritePipe;
        SI.hStdError := hWritePipe;
        StrPCopy(CmdLine, Command);
        if CreateProcess(nil, CmdLine, nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
        begin
           ExitCode := 0;
           while ExitCode = 0 do
           begin
              wrResult := WaitForSingleObject(PI.hProcess, 1000);
              if PeekNamedPipe(hReadPipe, @Dest[0], 32768,  @Avail, nil, nil) then
              begin
                 if Avail > 0 then
                 begin
                   try
                     FillChar(Dest, SizeOf(Dest), 0);
                     ReadFile(hReadPipe, Dest[0], Avail, BytesRead, nil);
                     TmpStr := Copy(Dest,0 , BytesRead-1);
                     Line:=Line+TmpStr;  
                   Except
                   end;
                 end;
              end;
                if wrResult <> WAIT_TIMEOUT then ExitCode := 1;
           end;
           GetExitCodeProcess(PI.hProcess, ExitCode);
           CloseHandle(PI.hProcess);
           CloseHandle(PI.hThread);
         end;
         finally
           if line='' then line:='NULL';    //命令没有输出回应!
           result:=Line;
           CloseHandle(hReadPipe);
           CloseHandle(hWritePipe);
       end;
    end;
      

  2.   

    剩下的做成多Table效果,我想你已经会了
      

  3.   

    楼上的  我是一为过路的,我对DELPHI还不太熟悉,我没看动你的写的也!能详细一点妈?
    那样我回感激不仅!
      

  4.   


    var
        h: HWND;
        aSheet: TTabSheet;
        i: Integer;
    begin
      h := FindWindow('ConsoleWindowClass', nil);
      i := 0;
      while h <> 0 do
      begin
        Inc(i);
        aSheet := TTabSheet.Create(PageControl1);
        aSheet.PageControl := PageControl1;
        aSheet.Caption := 'Server' + IntToStr(i);
        aSheet.Show;
        Windows.SetParent(h, aSheet.Handle);
        SendMessage(h, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
        h := FindWindow('ConsoleWindowClass', nil);
      end;
    end;