Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
ВнизПолучить результат выполнения команды DOS Найти похожие ветки
← →
Иксик (2003-03-03 15:44) [0]Можно ли как-нибудь получить в память результат выполнения команды DOS?
Например список файлов, выдаваемый командой dir.
Причем нужно получить его в память, а не в файл (типа dir >> text.txt).
← →
Иксик (2003-03-03 16:21) [1]Никак? :)
← →
REA (2003-03-03 16:27) [2]В CreateProcess есть в поле STARTUPINFO.hStdOutput - только что в хелпе прочитал. Сам не пробовал.
← →
Иксик (2003-03-03 16:29) [3]Никак? :)
← →
Иксик (2003-03-03 16:30) [4]Сори, случайно второй раз послал
← →
Иксик (2003-03-03 16:36) [5]STARTUPINFO.hStdOutput - у него тип cardinal, это не то.
← →
MBo (2003-03-03 16:41) [6]то, то
← →
Anatoly Podgoretsky (2003-03-03 16:41) [7]Почему это cardinal не устраивает, ну считай для себя, что это Longint
← →
Иксик (2003-03-03 16:48) [8]В смысле STARTUPINFO.hStdOutput - это указатель на список директорий?
← →
MBo (2003-03-03 16:50) [9]нет, это дескриптор пайпа ввода-вывода, который нужно перенаправить в своб программу
← →
Иксик (2003-03-03 16:52) [10]
> MBo
Я ужасно извиняюсь за свою глупость, но я понятия не имею как это сделать. Ты не мог бы написать по-подробнее? Или пример какой-нибудь элементарный.
← →
Иксик (2003-03-03 17:03) [11]Плиз...
← →
MBo (2003-03-03 17:09) [12]поиск в google STARTUPINFO.hStdOutput на первой же странице дал 2 или 3 дельфийских примера.
← →
Иксик (2003-03-04 13:03) [13]Спасибо Mbo,
я вчера уже уходил с работы и не смог ответить :)))
procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
const
ReadBuffer = 2400;
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
begin
With Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,@Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil,PChar(DosApp),@Security,
@Security,true,NORMAL_PRIORITY_CLASS,nil,nil,
start,ProcessInfo) then
begin
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],
ReadBuffer,BytesRead,nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
AMemo.Text := AMemo.text + String(Buffer);
until (BytesRead < ReadBuffer);
end;
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
Сейчас проверим...
← →
Иксик (2003-03-04 13:34) [14]Не получилось,
он запускает cmd, но не выполняет команды. Кто нибудь знает в чем дело?
← →
MBo (2003-03-04 13:42) [15]В этом примере только читается вывод консольки, но ничего туда не пишется (WritePipe не используется).
Hint - параметрв командной строки можно передать в CreateProcess(lpCommandLine)
А лучше найди компонент DosCommand.
← →
Иксик (2003-03-04 14:01) [16]CreateProcess(nil,PChar(DosApp),@Security,
@Security,true,NORMAL_PRIORITY_CLASS,nil,nil,
start,ProcessInfo)
Тут ведь и используется lpCommandLine, в нее посылается командная строка.
Я хочу сам сделать, без компонента.
← →
Иксик (2003-03-04 14:21) [17]Очень странная вещь!
Эта программа работала нормально, но когда я ее сохранил, она перестала работать нормально - создает второе окно и виснет
← →
Иксик (2003-03-04 14:28) [18]Люди, пожалуйста подскажите...
← →
Иксик (2003-03-04 14:50) [19]
> Эта программа работала нормально, но когда я ее сохранил,
> она перестала работать нормально - создает второе окно и
> виснет
Там просто какой-то глюк был.
> MBo ©
Как же мне все-таки это сделать? Я бы попробовал через WriteFile записывать в WritePipe, но ведь уже используется CreateProcess(PChar(DosApp))...
← →
Иксик (2003-03-04 15:15) [20]Ау!..
← →
Иксик (2003-03-04 15:37) [21]Почему это не работает?
procedure TForm1.RunDosInMemo(DosApp:String;AMemo:TMemo);
const
ReadBuffer = 2400;
var
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead, BytesWritten : DWord;
Apprunning : DWord;
str : PChar;
begin
With Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,@Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
if CreateProcess(nil,PChar(DosApp),@Security,
@Security,true,NORMAL_PRIORITY_CLASS,nil,nil,
start,ProcessInfo) then
begin
str:=PChar(edit2.text);
WriteFile(WritePipe,str,SizeOf(str),BytesWritten,nil);
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
repeat
BytesRead := 0;
ReadFile(ReadPipe,Buffer[0],
ReadBuffer,BytesRead,nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
AMemo.Text := AMemo.text + String(Buffer);
until (BytesRead < ReadBuffer);
end;
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
← →
Иксик (2003-03-04 16:09) [22]Народ, ну пожалуйста!!!!!!!!!!!!!!!!!!!!!!!!
← →
MBo (2003-03-04 16:11) [23]Найди компонент, который я посоветовал
Судя по нескольким ошибкам в выделенной строке, это будет быстрее
← →
Иксик (2003-03-04 16:20) [24]
> MBo ©
Ты не мог бы попытаться объяснить мне что к чему. Я хочу разобраться, а не использовать готовое.
← →
MBo (2003-03-04 16:22) [25]читай MSDN, там есть пример
← →
Иксик (2003-03-04 16:27) [26]Ок, спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c