![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CMD
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)