Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CMD


Страницы:   1 2

Klopan ©   (2004-09-20 20:58:00) 

как получить вывод из командной строки?


klopan   (2004-09-20 22:45:00) [1]

> Так? 8)

так, всем спасибо!


Zacho   (2004-09-20 22:36:00) [2]

Ещё раз :)
Задачу описать можешь ?


Fay   (2004-09-20 22:34:00) [3]

Так? 8)
function TForm1.RunCaptured(_exeName, _cmdLine: string): Boolean;
var
start: TStartupInfo;
procInfo: TProcessInformation;
tmpName: string;
tmp: Windows.THandle;
tmpSec: TSecurityAttributes;
res: TStringList;
return: Cardinal;
i: integer;
begin
Result := False;
try
  { Setze ein Temporares File }
  { Set a temporary file }
  tmpName := 'Test.tmp';
  FillChar(tmpSec, SizeOf(tmpSec), #0);
  tmpSec.nLength := SizeOf(tmpSec);
  tmpSec.bInheritHandle := True;
  tmp := Windows.CreateFile(PChar(tmpName),
         Generic_Write, File_Share_Write,
         @tmpSec, Create_Always, File_Attribute_Normal, 0);
  try
    FillChar(start, SizeOf(start), #0);
    start.cb          := SizeOf(start);
    start.hStdOutput  := tmp;
    start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;
    start.wShowWindow := SW_Minimize;
    { Starte das Programm }
    { Start the program }
    if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,
                     0, nil, nil,start, procInfo) then
    begin
      SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
      WaitForSingleObject(procInfo.hProcess, Infinite);
      GetExitCodeProcess(procInfo.hProcess, return);
      Result := (return = 0);
      CloseHandle(procInfo.hThread);
      CloseHandle(procInfo.hProcess);
      Windows.CloseHandle(tmp);
      { Die Ausgaben hinzufugen }
      { Add the output }
      res := TStringList.Create;
      try
        res.LoadFromFile(tmpName);
        for i:= 0 to res.Count - 1 do
        RichEdit1.Lines.Add(DosToWin(res.Strings[i]));
      finally
        res.Free;
      end;
      Windows.DeleteFile(PChar(tmpName));
    end
    else
    begin
      Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
        'RunCaptured Error', MB_OK);
    end;
  except
    Windows.CloseHandle(tmp);
    Windows.DeleteFile(PChar(tmpName));
    raise;
  end;
finally
end;
end;


klopan   (2004-09-20 22:26:00) [4]

мог бы - непросил


Fay   (2004-09-20 22:24:00) [5]

Сам убрать можешь?


klopan   (2004-09-20 22:22:00) [6]

ну что тут непонятного?

нужно из функции убрать "const _dirName"

чтоб получилось так: function TForm1.RunCaptured(const _exeName, _cmdLine: string): Boolean;


Zacho   (2004-09-20 22:18:00) [7]

Блин, ещё раз: опиши задачу !
И почитай http://ln.com.ua/~openxs/articles/smart-questions-ru.html


klopan   (2004-09-20 22:11:00) [8]


function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;
var
 start: TStartupInfo;
 procInfo: TProcessInformation;
 tmpName: string;
 tmp: Windows.THandle;
 tmpSec: TSecurityAttributes;
 res: TStringList;
 return: Cardinal;
 i: integer;
begin
 Result := False;
 try
   { Setze ein Temporares File }
   { Set a temporary file }
   tmpName := 'Test.tmp';
   FillChar(tmpSec, SizeOf(tmpSec), #0);
   tmpSec.nLength := SizeOf(tmpSec);
   tmpSec.bInheritHandle := True;
   tmp := Windows.CreateFile(PChar(tmpName),
          Generic_Write, File_Share_Write,
          @tmpSec, Create_Always, File_Attribute_Normal, 0);
   try
     FillChar(start, SizeOf(start), #0);
     start.cb          := SizeOf(start);
     start.hStdOutput  := tmp;
     start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;
     start.wShowWindow := SW_Minimize;
     { Starte das Programm }
     { Start the program }
     if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,
                      0, nil, PChar(_dirName), start, procInfo) then
     begin
       SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
       WaitForSingleObject(procInfo.hProcess, Infinite);
       GetExitCodeProcess(procInfo.hProcess, return);
       Result := (return = 0);
       CloseHandle(procInfo.hThread);
       CloseHandle(procInfo.hProcess);
       Windows.CloseHandle(tmp);
       { Die Ausgaben hinzufugen }
       { Add the output }
       res := TStringList.Create;
       try
         res.LoadFromFile(tmpName);
         for i:= 0 to res.Count - 1 do
         RichEdit1.Lines.Add(DosToWin(res.Strings[i]));
       finally
         res.Free;
       end;
       Windows.DeleteFile(PChar(tmpName));
     end
     else
     begin
       Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
         'RunCaptured Error', MB_OK);
     end;
   except
     Windows.CloseHandle(tmp);
     Windows.DeleteFile(PChar(tmpName));
     raise;
   end;
 finally
 end;
end;


есть эта функция.
надо чтоб в ней небыло _dirName. т.к если использовать команду: cd c:\windows\system32\ то путь неменяется.


Zacho   (2004-09-20 22:06:00) [9]

klopan ©   (20.09.04 22:03) [13]
Ты лучше свою задачу опиши.


klopan   (2004-09-20 22:03:00) [10]

:)

а если использовать такую команду: cd c:\windows\system32\


Fay   (2004-09-20 22:00:00) [11]

cmd.exe /?


klopan   (2004-09-20 21:56:00) [12]

как оставить только cmd.exe и саму команду в это функции?


Fay   (2004-09-20 21:49:00) [13]


> но мне нужно чтоб в ней небыло _dirName, т.е только имя
> cmd.exe файла и сама команда.

Не возражаю. 8)
Есть проблемы?


klopan   (2004-09-20 21:48:00) [14]

можно ли такое?


klopan   (2004-09-20 21:38:00) [15]

ага, нашел я код. все работает. Спасиба.

[code]
function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;
var
 start: TStartupInfo;
 procInfo: TProcessInformation;
 tmpName: string;
 tmp: Windows.THandle;
 tmpSec: TSecurityAttributes;
 res: TStringList;
 return: Cardinal;
 i: integer;
begin
 Result := False;
 try
   { Setze ein Temporares File }
   { Set a temporary file }
   tmpName := 'Test.tmp';
   FillChar(tmpSec, SizeOf(tmpSec), #0);
   tmpSec.nLength := SizeOf(tmpSec);
   tmpSec.bInheritHandle := True;
   tmp := Windows.CreateFile(PChar(tmpName),
          Generic_Write, File_Share_Write,
          @tmpSec, Create_Always, File_Attribute_Normal, 0);
   try
     FillChar(start, SizeOf(start), #0);
     start.cb          := SizeOf(start);
     start.hStdOutput  := tmp;
     start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;
     start.wShowWindow := SW_Minimize;
     { Starte das Programm }
     { Start the program }
     if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,
                      0, nil, PChar(_dirName), start, procInfo) then
     begin
       SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
       WaitForSingleObject(procInfo.hProcess, Infinite);
       GetExitCodeProcess(procInfo.hProcess, return);
       Result := (return = 0);
       CloseHandle(procInfo.hThread);
       CloseHandle(procInfo.hProcess);
       Windows.CloseHandle(tmp);
       { Die Ausgaben hinzufugen }
       { Add the output }
       res := TStringList.Create;
       try
         res.LoadFromFile(tmpName);
         for i:= 0 to res.Count - 1 do
         RichEdit1.Lines.Add(DosToWin(res.Strings[i]));
       finally
         res.Free;
       end;
       Windows.DeleteFile(PChar(tmpName));
     end
     else
     begin
       Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
         'RunCaptured Error', MB_OK);
     end;
   except
     Windows.CloseHandle(tmp);
     Windows.DeleteFile(PChar(tmpName));
     raise;
   end;
 finally
 end;
end;
[/code]

но мне нужно чтоб в ней небыло _dirName, т.е только имя cmd.exe файла и сама команда.


Fay   (2004-09-20 21:21:00) [16]

2  [4] klopan ©   (20.09.04 21:19)
Если вопрос мне, то из Kernel32.dll. Можно просто "из модуля" Windows.


Zacho   (2004-09-20 21:20:00) [17]


>Defunct ©   (20.09.04 21:08)
> вывод чего?

Не лишним будет ещё спросить "И куда ? И зачем ?"
:-)


Fay   (2004-09-20 21:20:00) [18]

Ага. Там надо заменить lpStartupInfo.hStdOutput


klopan   (2004-09-20 21:19:00) [19]

а это не из какой-то dll берется?


Fay   (2004-09-20 21:17:00) [20]

С помощью CreateProcess, к примеру. Готово кода под рукой нет. М.б. наморщу 8)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо