Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

CMD   Найти похожие ветки 

 
Klopan ©   (2004-09-20 20:58) [0]

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


 
Defunct ©   (2004-09-20 21:08) [1]

вывод чего?


 
klopan ©   (2004-09-20 21:15) [2]

командной строки

(Microsoft Windows XP [версия 5.1.2600]
(‘) корпорация майкрософт, 1985-2001.)

и все остальное


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

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


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

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


 
Fay ©   (2004-09-20 21:20) [5]

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


 
Zacho ©   (2004-09-20 21:20) [6]


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

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


 
Fay ©   (2004-09-20 21:21) [7]

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


 
klopan ©   (2004-09-20 21:38) [8]

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

[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 файла и сама команда.


 
klopan ©   (2004-09-20 21:48) [9]

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


 
Fay ©   (2004-09-20 21:49) [10]


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

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


 
klopan ©   (2004-09-20 21:56) [11]

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


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

cmd.exe /?


 
klopan ©   (2004-09-20 22:03) [13]

:)

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


 
Zacho ©   (2004-09-20 22:06) [14]

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


 
klopan ©   (2004-09-20 22:11) [15]


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:18) [16]

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


 
klopan ©   (2004-09-20 22:22) [17]

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

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

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


 
Fay ©   (2004-09-20 22:24) [18]

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


 
klopan ©   (2004-09-20 22:26) [19]

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


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

Так? 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;


 
Zacho ©   (2004-09-20 22:36) [21]

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


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

> Так? 8)

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
4-1093677521
WELLiON
2004-08-28 11:18
2004.10.03
CTRL+SHIFT


8-1089293375
Tahion2
2004-07-08 17:29
2004.10.03
HLS перевести в RGB


1-1095258879
Kovsh
2004-09-15 18:34
2004.10.03
Как зарегестрировать три горячие клавиши?


1-1095413551
Чайник
2004-09-17 13:32
2004.10.03
и снова цвет...


3-1094022900
-SeM-
2004-09-01 11:15
2004.10.03
Сервисы в Interbase/Firebird/Yaffil