Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];

Вниз

Команда DOS без окна?   Найти похожие ветки 

 
Влад2   (2002-12-05 22:43) [0]

Как выполнить команду DOS, чтобы:
1. окно DOS не появлялось на экране;
2. выполнение задачи не продолжалось, пока не выполнится команда DOS (например, распаковка архива - довольно долгая).

1. - выполняется легко (WinExec("...", SW_HIDE))
А в сочетаниии с 2. - ???

Спасибо.
(программирую на С++Builder, но это неважно)


 
Song   (2002-12-05 22:45) [1]

2 в сочетании с WinExec() не получится. Нужно использоваться либо CreateProcess() либо ShellExecuteEx(), а потом WaitForSingleObject() с параметром INFINITE (только для Win32 консольных или оконных приложений).


 
Влад2   (2002-12-06 19:43) [2]

Если пользоваться CreateProcess(), никак не получается скрыть окно DOS :((


 
Almaz   (2002-12-07 01:38) [3]


> Влад2 (06.12.02 19:43)
> Если пользоваться CreateProcess(), никак не получается скрыть
> окно DOS :((

Попробуйте так:

function ExecuteAndWait(FileName: String): Boolean;
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.wShowWindow := SW_HIDE;
Result := CreateProcess(nil, PChar(FileName), nil, nil, FALSE,
CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI);
if Result then
begin
CloseHandle(PI.hThread);
WaitForSingleObject(PI.hProcess, INFINITE);
CloseHandle(PI.hProcess);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ExecuteAndWait("test.exe /a /e");
end;


Функция запускает приложение, не показывая его окна, затем ожидает его завершения.

P.S. Однако следует учитывать следующую особенность ожидания - если операция длительная, то на время ее выполнения ваша программа как бы "зависнет", и никак не будет реагировать на команды пользователя, поэтому советую запускать вам подобные операции отдельным потоком.

Удачи.


 
Song   (2002-12-07 09:36) [4]

2Влад2 (06.12.02 19:43)
Действительно иногда у CreateProcess() видел такую особенность. Я использовал в этом случае ShellExecuteEx() и всё было пучком.

>>P.S. Однако следует учитывать следующую особенность ожидания - если операция
>>длительная, то на время ее выполнения ваша программа как бы "зависнет", и никак
>>не будет реагировать на команды пользователя, поэтому советую запускать вам
>>подобные операции отдельным потоком

Можно и без потока. Надо использовать ShellExecuteEx(), а после вызова сделать цикл с TApplication.ProcessMessages+GetExitCodeProcess()


 
Влад2   (2002-12-09 10:48) [5]

Уважаемый Almaz:
>> Функция запускает приложение, не показывая его окна, затем ожидает его завершения.

К сожалению, Ваш код работает ТАК ЖЕ, как у меня (он практически такой же). Чёрное окно DOS с заголовком "Ярлык <имя задачи>" всё равно ПОЯВЛЯЕТСЯ (оно находится позади главной формы приложения).
Спасибо Вам за желание помочь.

Уважаемый Song:
Наверное, ShellExecuteEx() работает также, как WinExec(), но я никогда не пользовался ей. И никогда не использовал цикл с TApplication.ProcessMessages+GetExitCodeProcess(). Не могли бы Вы привести кусочек кода?
Спасибо!



 
oomneeq   (2002-12-09 11:33) [6]

Вот здесь пример приложения.
Работает.
http://delphi.about.com/library/bluc/apps/consoleingui.zip


 
Song   (2002-12-09 11:50) [7]

>>К сожалению, Ваш код работает ТАК ЖЕ, как у меня (он практически такой же). Чёрное окно DOS с заголовком "Ярлык <имя задачи>" всё равно ПОЯВЛЯЕТСЯ (оно находится позади главной формы приложения).

Это значит что запускаемая программа - дос-программа. Нужна консольная или оконная программа.
Для случаев с ДОС программой запрошенный кусок кода смотрите здесь:
http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=delphi;action=display;num=1038323024


 
Влад2   (2002-12-09 18:54) [8]

Большое спасибо всем откликнувшимся!
Воспользовался примером oomneeq (это было ближе к моей программе). Ключевыми моментами оказались:
1. Значение CREATE_NO_WINDOW флага dwCreationFlags в функции CreateProcess(). Это значение отсутствует в Help"е этой функции!
2. Значение dwFlags = STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW флага dwFlags.
При этом для скратия окна DOS под Windows XP достаточно было п.1, а для работы под Windows 98 потребовался п.2.

Пример Song"а мне тоже пригодится.

Спасибо всем.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
3-61497
sen
2002-12-02 15:21
2002.12.19
Частичная выборка


1-61692
Redscotch
2002-12-08 19:36
2002.12.19
Окно


3-61464
b_baranov
2002-12-02 04:06
2002.12.19
Как перехватить отправку в базу записи, содержащей Null-значения


4-61883
AndreyH
2002-11-05 14:16
2002.12.19
Симулятор LPT1


3-61403
BorisUK
2002-11-21 12:04
2002.12.19
Опять Вопрос по EhLib.... ПРО СОРТИРОВКУ ЛОКАЛЬНО!!!!





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