Главная страница
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.011 c
6-61725
battar
2002-10-23 22:38
2002.12.19
Как из консольного приложения сделать TNMPOP3?


14-61821
php
2002-11-29 18:08
2002.12.19
FTP


3-61391
Stenkz
2002-12-02 05:47
2002.12.19
Может ли TQuery обращаться не к физической таблице, а к другому .


14-61795
Слесарь Матерящийся
2002-11-28 13:47
2002.12.19
Очень нужная программа


14-61825
Maksss
2002-11-29 20:23
2002.12.19
Как включить внешний модем