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

Вниз

Завершение работы консольного приложения   Найти похожие ветки 

 
Basil   (2002-04-02 13:21) [0]

День добрый! Помогите разобраться с проблемой:
Запускаю досовскую программку (к примеру arj) с помощью WinExec, ShellExecute или CreateProcess -- везде одинаковая ситуация. Если я ставлю параметр Sw_Show, программа выполняется и остается консольное окошко (сеанс завершен). А вот если я ставлю Sw_Hide -- программа выполняется, но работу не завершает. В системе она висит как winoldap. Что я не так делаю (или не делаю)?


 
Song   (2002-04-02 13:41) [1]

Winoldap - это вообще-то так называется процесс от программы Евгения Рошаля "Far Manager".
А закрыть консольное окошко можно также как и все остальные:
SendMessage(FindWindow("","название"),WM_CLOSE,0,0);


 
Basil   (2002-04-02 13:48) [2]

Да! Если знать, что программа уже закончила работать. А как это узнать (WaitForSingleObject не помогает).


 
Song   (2002-04-02 15:06) [3]

Вот так будет всё работать. Не забдутьте nShow подкорректировать, если нужно.

Procedure TForm5.CrProcess;
Var SeInfo:TShellExecuteInfo;
ExitCode:DWord;
Begin
FillChar(SEInfo,SizeOf(SEInfo),0);
With SEInfo Do
Begin
cbSize:=SizeOf(TShellExecuteInfo);
fmask:=SEE_MASK_NOCLOSEPROCESS;
Wnd:=Application.Handle;
lpFile:=PChar("имя_файла_архиватора");
lpParameters:=PChar("строка_с_ключами");
lpDirectory:=PChar("Временная_директория"); // Можно nil
nShow:=SW_HIDE;
End;
IF ShellExecuteEx(@SEInfo) then
Repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess,ExitCode);
Until(ExitCode<>STILL_ACTIVE) or (Application.Terminated) else MessageDlg("Ошибка создания внешнего процесса.",mtError,[mbAbort],0);
End;

P.S. Недавно адаптировал эту процедурку под arj, потому что именно arj по какой-то причине не срабатывает на ExitCode<>STILL_ACTIVE. Если у Вас будет такая же шняга, напишите, я запостю алтернативный вариант. Показания такие: процесс исполняется, заканчивает исполнение, пишет "Сеанс завершён" в заголовке, но управление программе не передаётся т.е. управление за цикл Repeat ... Until не выходит.


 
Basil   (2002-04-03 09:49) [4]

2 Song. Попробовал Вашу процедурку -- ничего не изменилось. Побовал и arj и pkzip -- "умирает" в цикле, т.е. ExitCode постоянно Still_Active.


 
Song   (2002-04-03 10:06) [5]

Я делал c rar.exe. У меня всё вышло.
В Вашем случае тогда постю алтернативный вариант. Нужно проверять на наличие окна "Сеанс завершён" через FindWindow:

Procedure CrProcess(S:String);
Var SeInfo:TShellExecuteInfo;
Begin
FillChar(SEInfo,SizeOf(SEInfo),0);
With SEInfo Do
Begin
cbSize:=SizeOf(TShellExecuteInfo);
fmask:=SEE_MASK_NOCLOSEPROCESS;
Wnd:=Application.Handle;
lpFile:=PChar("...");
lpParameters:=PChar("...");
lpDirectory:=PChar("...");
nShow:=SW_HIDE;
End;
IF ShellExecuteEx(@SEInfo) then
Repeat
Application.ProcessMessages;
IF FindWindow(nil,"(Сеанс завершен) - Arj")<>0 then
Begin
SendMessage(FindWindow(nil,"(Сеанс завершен) - Arj"),WM_CLOSE,0,0);
Application.ProcessMessages;
Break;
End;
Until False else MessageDlg("Ошибка создания внешнего процесса.",mtError,[mbAbort],0);
End;


P.S. Не забудьте подкорректировать строку в FindWindow


 
Basil   (2002-04-03 10:32) [6]

Это, конечно, вариант, спасибо за подсказку. Но неужели никак по-другому нельзя определить, что приложение уже закончило свою работу, ведь Caption (Сеанс завершен) какой-то командой выводится, и я не думаю, что это Dos-овская команда.
Но, тем не менее -- благодарю за помощь.


 
Song   (2002-04-03 10:59) [7]

2Basil © (03.04.02 10:32)
Это довольно рабочий вариант, особенно, если автоматизировать поиск окна "Сеанс завершён" по SEInfo.lpFile:

...
IF ShellExecuteEx(@SEInfo) then
Repeat
Application.ProcessMessages;
IF FindWindow(nil,PChar("(Сеанс завершен) - "+Copy(ExtractFileName(String(SEInfo.lpFile)),1,Length(ExtractFileName(String(SEInfo.lpFile)))-4)))<>0 then
Begin
SendMessage(FindWindow(nil,PChar("(Сеанс завершен) - "+Copy(ExtractFileName(String(SEInfo.lpFile)),1,Length(ExtractFileName(String(SEInfo.lpFile)))-4))),WM_CLOSE,0,0);
Application.ProcessMessages;
Break;
End;
Until False else MessageDlg("Ошибка создания внешнего процесса.",mtError,[mbAbort],0);

В этом случае Вы можете использовать любой архиватор, окно удалиться автоматически.



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

Форум: "WinAPI";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
6-18079
DikobraZ
2002-03-25 19:13
2002.06.06
Сокеты


3-17798
Nameless
2002-05-16 04:17
2002.06.06
Alias для базы данных


1-17955
Fareader
2002-05-28 11:36
2002.06.06
Цвета RX Library


3-17778
Dimaiv
2002-05-15 08:08
2002.06.06
Поиск для русских слов учитывает регистр, а для английских нет


14-18135
Rammish
2002-05-02 21:04
2002.06.06
О web-страницах





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