Форум: "Основная";
Текущий архив: 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.009 c