Главная страница
    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.066 c
3-1094053694
Алексей
2004-09-01 19:48
2004.10.03
FOX,ADO и отрицательные числа


8-1089106744
REA
2004-07-06 13:39
2004.10.03
Big Bitmap


1-1095455920
Чайник
2004-09-18 01:18
2004.10.03
Не понял! Цвета палитры виндовс (типа clBtnShadow и т.д)


6-1090592600
webpauk
2004-07-23 18:23
2004.10.03
WinApi


4-1093595558
Andrey
2004-08-27 12:32
2004.10.03
CTRL+INS (эмулировать их нажатие)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский