Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-39288
Эдуард
2003-03-03 22:31
2003.03.13
Как узнать как было запущено приложение?


14-39550
Beginner N1024
2003-02-19 01:05
2003.03.13
Как открыть в D5 проект, написанный в D7


3-39207
Leviathan
2003-02-21 22:30
2003.03.13
DBGrid


4-39640
maxim2
2003-01-22 09:08
2003.03.13
Послать сообщение окну


14-39518
Gydrop
2003-02-25 23:07
2003.03.13
Значение ключа по умолчанию в реестре





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