Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.19;
Скачать: CL | DM;

Вниз

Команда 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
6-61729
Юрий
2002-10-24 05:31
2002.12.19
TClientSocket в компоненте


1-61628
z27
2002-12-06 17:24
2002.12.19
Квадратный корень


1-61523
dimonf
2002-12-09 10:13
2002.12.19
Передача данных в TreeView!


1-61657
Dmitry_K
2002-12-07 19:52
2002.12.19
Как изменить атрибут файла


4-61857
MrAngel
2002-10-15 17:51
2002.12.19
Избегание настроек виндовса...