C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Завершение внешнего приложения, Завершение внешнего приложения
lolitasr
  Отправлено: 03.12.2004, 12:28


Ученик-кочегар

Группа: Участник
Сообщений: 7



Мальчишки помогите
Такая проблемка: из моей программки запускаю внешнюю программку, она делает что то полезное, затем заканчивает свою работу, вот здесь мне надо продолжить работу своей программки.
Очень прошу кодом если не трудно. Простите девчонку за настойчивость. Ну очень надо!
Gedeon
Отправлено: 03.12.2004, 12:55


Ветеран

Группа: Модератор
Сообщений: 1742



Как запускаете програмку, плясать надо отсюда, а вообще главному окну програмки можно послать сообщение WM_CLOSE
Guest
Отправлено: 03.12.2004, 13:24


Не зарегистрирован







подобное видел тут
lolitasr
Отправлено: 03.12.2004, 14:16


Ученик-кочегар

Группа: Участник
Сообщений: 7




ShellExecute(Handle,"open","C:\\ddd\\aplecation.exe",NULL,NULL,SW_RESTORE);
lolitasr
Отправлено: 03.12.2004, 14:42


Ученик-кочегар

Группа: Участник
Сообщений: 7



Видимо меня не правильно поняли не закрыть внешнюю программу, она сама закроется, нужно словить момент когда она отработала и продолжить работу моей программы.
lolitasr
Отправлено: 03.12.2004, 14:53


Ученик-кочегар

Группа: Участник
Сообщений: 7



Спасибо за внимание? но ссылка "Guest" ситуацию не прояснила, более того запутала, неужели нет простого решения. По имени *.езешника на пример. sad.gif
AVC
Отправлено: 03.12.2004, 15:29


Ветеран

Группа: Модератор
Сообщений: 1583



Может попробовать проверять список процессов?


Отредактировано AVC — 03/12/2004, 15:33
Konstantine
Отправлено: 03.12.2004, 15:50


Мастер участка

Группа: Модератор
Сообщений: 545



для запоуска проги использовать CreateProcess, затем получить pID и затем проверять запущен ли этот процесс
lolitasr
Отправлено: 03.12.2004, 15:53


Ученик-кочегар

Группа: Участник
Сообщений: 7



Может быть, а как? wink.gif
Gedeon
Отправлено: 03.12.2004, 16:19


Ветеран

Группа: Модератор
Сообщений: 1742



А я бы все таки рекомендовал использовать совет alexandroid из ссылки приведенной Guest (сдается мне это был AVC) т.к. считаю это наиболее правильным решением, тем более что нет ограничения на какую-либо ось (из форточек конечно).
AVC
Отправлено: 03.12.2004, 16:34


Ветеран

Группа: Модератор
Сообщений: 1583



2Gedeon вы правы в своем предроложении smile.gif , но прочитав посты после примера alexandroid я засомневался в работоспособности кода.
Gedeon
Отправлено: 03.12.2004, 16:55


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 03/12/2004, 17:36)
прочитав посты после примера alexandroid я засомневался в работоспособности кода.

Рабоет, я так делал, исходники не сохранились, заново делать не хочу, ну уж если не получится у lolitasr тада поможем smile.gif . Только Вы хоть сами попробуйте.
lolitasr
Отправлено: 03.12.2004, 17:16


Ученик-кочегар

Группа: Участник
Сообщений: 7



Я поняла что делать необходимо через
CreateProcess()

STARTUPINFO si;
PROCESS_INFORMATION pi;
unsigned long ExitCode;

if (CreateProcess (NULL,"aplecation.exe",NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS,NULL,
0,&si,& pi) == true){
CloseHandle (pi.hThread);
WaitForSingleObject (pi.hProcess, INFINITE); GetExitCodeProcess (pi.hProcess, &ExitCode);
CloseHandle (pi.hProcess);
}

А что дальше?
lolitasr
Отправлено: 04.12.2004, 14:12


Ученик-кочегар

Группа: Участник
Сообщений: 7



Ну мальчишки... sad.gif
не можете помочь девушке.
Я так надеялась на вас, умных и чутких.
Хлор
Отправлено: 05.12.2004, 15:23


Дежурный стрелочник

Группа: Участник
Сообщений: 78



В папке билдера есть examples\apps\procview
Так вот, там пример как получить список всех процессов и их PID.
Потом сравниваешь их с PID своего процесса и все...... smile.gif

Хотя наверно стоит сделать с хуком smile.gif красивей будет

Да и еще насколько я помню, то CommandLine в CreateProcess используем при запуске 16 рязрядных DOS приложений.
А для 32 используем ApplicationName...

Или меня портачит в связи с затянувшимися праздниками ?smile.gif
Gedeon
Отправлено: 06.12.2004, 08:53


Ветеран

Группа: Модератор
Сообщений: 1742



Вот про совершенно полезнейшую функцию-то я и позабыл
CODE

#include <process.h>

char *File = "C:\\1.exe";
spawnlp(P_WAIT,File,"",NULL); // сделает то что Вам надо и всего 1 строка


biggrin.gif Что-то с памятью моей стало ...

Отредактировано Gedeon — 06/12/2004, 09:56
Konstantine
Отправлено: 06.12.2004, 10:19


Мастер участка

Группа: Модератор
Сообщений: 545



Gedeon, это — ДОСовая функция и её тут лучше не использовать...
список процессов тоже не нужЁн...

lolitesr, Я ещё в птн, сразу пришёл и сделал, а взять забыл sad.gif — хорошо с парнями посидели smile.gif шо аж сушит щас
суть примерно помню... CreateProcess возвращает хендл процесса (h), а потом по таймеру (я поставил период 0.1 сек):
GetExitCodeProcess (h, &ExitCode);
и если в этот момент процесс работает — ExitCode говорит, что процесс ещё работает...
в общем где-то так... если не разберёшься, то завтра принесу...

Отредактировано Konstantine — 06/12/2004, 11:24
Gedeon
Отправлено: 06.12.2004, 11:49


Ветеран

Группа: Модератор
Сообщений: 1742



Ну раз уж так и не получилось, вот как обещал
CODE

STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(π, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
if(CreateProcess(NULL,
"mirc615.exe",
NULL,
NULL,
false,
NULL,
NULL,
NULL,
&si,
π)){
WaitForSingleObject(pi.hThread,INFINITE);
ShowMessage("CreateProcess stopped");
}
else{
ShowMessage("CreateProcess Failed");
}

Таймеры использовать для таких целей неправильно — это лишняя нагрузка на систему. По поводу ShellExecute по человечески сделать ожидание не получится, как раз только через таймеры, но вот есть такая замечательная ф-ция
CODE

BOOL ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo
);

так вот у нее в структуре есть такой член fMask, так вот если ему присвоить значение
QUOTE

SEE_MASK_NOCLOSEPROCESS
Use to indicate that the hProcess member receives the process handle. This handle is typically used to allow an application to find out when a process created with ShellExecuteEx terminates. In some cases, such as when execution is satisfied through a DDE conversation, no handle will be returned. The calling application is responsible for closing the handle when it is no longer needed.

то после ее вызова значение члена hProcess будет содержать дескриптор процесса вызванного приложения, к-рый можно передать в функцию WaitForSingleObject.
Вот примерно так
CODE

   SHELLEXECUTEINFO sei;
   memset(&si, 0, sizeof(si));
   sei.cbSize = sizeof(si);
   sei.hwnd = Handle;
   sei.lpVerb = "open";
   sei.lpFile = "C:\\sei.txt";
   sei.nShow = SW_NORMAL;
   sei.fMask = SEE_MASK_NOCLOSEPROCESS;
   if(ShellExecuteEx(&sei)){
       WaitForSingleObject(sei.hProcess,INFINITE);
       ShowMessage("ShellExecute stopped");
   }
   else{
       ShowMessage("ShellExecute Failed");
   }

А по поводу spawnlp не вижу ни одной причины не использовать ее.

Отредактировано Gedeon — 06/12/2004, 12:56

Вернуться в Вопросы программирования в C++Builder