Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.033 c
14-1094930070
yanval
2004-09-11 23:14
2004.10.03
крутая реклама дохтура Касперского - помогите, я боюсь!


14-1095402387
1008
2004-09-17 10:26
2004.10.03
Вопросик о QuickReport


1-1095222353
ККВ
2004-09-15 08:25
2004.10.03
Деньги


14-1093930850
McSimm
2004-08-31 09:40
2004.10.03
Нас опять взломали, извините.


4-1092872191
RyDmi
2004-08-19 03:36
2004.10.03
Копия программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский