Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизПолучение результатов выполнения командной строки Найти похожие ветки
← →
Jetus © (2005-01-28 10:47) [0]Уважаемые мастера! Есть такая беда: я выполняю функцией WinExec() некоторые команды командной строки Windows XP, например:
WinExec("cmd /c SystemInfo", 1);
В результате данная командная строка выводит кучу полезных даных о компе.
Как получить эти данные в своей программе и поместить их, например, в Мемо?
← →
Kerk © (2005-01-28 10:51) [1]WinExec("cmd /c SystemInfo >blabla.txt", 1);
или stdout перенаправь
← →
xShadow © (2005-01-28 10:56) [2]речь идёт о перенаправлении вывода
Function GetDosOutput( const CommandLine, WorkDir: String; var
ResultCode: Cardinal ): String;
var StdOutPipeRead, StdOutPipeWrite: THandle;
SA : TSecurityAttributes;
SI : TStartupInfo;
PI : TProcessInformation;
WasOK : Boolean;
Buffer : array[0..255] of Char;
BytesRead : Cardinal;
Line : String;
Begin
//Application.ProcessMessages;
With SA do
Begin
nLength := SizeOf( SA );
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
// создаём пайп для перенаправления стандартного вывода
CreatePipe( StdOutPipeRead, // дескриптор чтения
StdOutPipeWrite, // дескриптор записи
@SA, // аттрибуты безопасности
0 // количество байт принятых для пайпа - 0 по умолчанию
);
try
// Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
// а так же проверяем, чтобы он не показывался на экране.
with SI do
Begin
FillChar( SI, SizeOf( SI ), 0 );
cb := SizeOf( SI );
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle( STD_INPUT_HANDLE ); // стандартный ввод не перенаправляем
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
//Запускаем компилятор из командной строки
//WorkDir := ExtractFilePath(CommandLine);
WasOK := CreateProcess( nil,
PChar( CommandLine ),
nil,
nil,
True,
0,
nil,
PChar( WorkDir ),
SI,
PI );
// Теперь, когда дескриптор получен, для безопасности закрываем запись.
// Нам не нужно, чтобы произошло случайное чтение или запись.
CloseHandle( StdOutPipeWrite );
// если процесс может быть создан, то дескриптор, это его вывод
if not WasOK then
raise Exception.Create( "Ошибка выполнения или компиляции: " +
Chr( 10 ) + Chr( 13 ) + CommandLine )
else
try
// получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
Line := "";
Repeat
// читаем блок символов (могут содержать возвраты каретки и переводы строки)
WasOK := ReadFile( StdOutPipeRead, Buffer, 255, BytesRead, nil );
// есть ли что-нибудь ещё для чтения?
if BytesRead > 0 then
Begin
// завершаем буфер PChar-ом
Buffer[BytesRead] := #0;
// добавляем буфер в общий вывод
Line := Line + Buffer;
end;
//Application.ProcessMessages;
Until not WasOK or ( BytesRead = 0 );
// ждём, пока завершится консольное приложение
WaitForSingleObject( PI.hProcess, INFINITE );
ResultCode := 0;
GetExitCodeProcess( PI.hProcess, ResultCode );
finally
// Закрываем все оставшиеся дескрипторы
CloseHandle( PI.hThread );
CloseHandle( PI.hProcess );
end;
finally
Result := Line;
CloseHandle( StdOutPipeRead );
end;
end;
Использовать так:
Memo1.Lines.Text := GetDosOutput( "del c:\*.*", "c:\", Rc );
← →
Jetus © (2005-01-29 21:53) [3]Огромное спасибо, xShadow!
Обязательно попробую, когда новую Дельфу поставлю ;)
← →
Jetus © (2005-02-01 18:07) [4]К сожалению, xShadow, твой код не работает - выдает ошибку в строке
if not WasOK then
raise Exception.Create( "Ошибка выполнения или компиляции: " +
Chr( 10 ) + Chr( 13 ) + CommandLine )
Почему то не WasOK := CreateProcess() не запускает процесс и соответственно выкидываен ошибку. В чем причина?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c