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" ситуацию не прояснила, более того запутала, неужели нет простого решения. По имени *.езешника на пример. |
|
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
|
Может быть, а как? |
|
Gedeon |
Отправлено: 03.12.2004, 16:19 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
А я бы все таки рекомендовал использовать совет alexandroid из ссылки приведенной Guest (сдается мне это был AVC) т.к. считаю это наиболее правильным решением, тем более что нет ограничения на какую-либо ось (из форточек конечно).
|
|
AVC |
Отправлено: 03.12.2004, 16:34 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
2Gedeon вы правы в своем предроложении , но прочитав посты после примера alexandroid я засомневался в работоспособности кода. |
|
Gedeon |
Отправлено: 03.12.2004, 16:55 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (AVC @ 03/12/2004, 17:36) | прочитав посты после примера alexandroid я засомневался в работоспособности кода. |
Рабоет, я так делал, исходники не сохранились, заново делать не хочу, ну уж если не получится у lolitasr тада поможем . Только Вы хоть сами попробуйте.
|
|
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
|
Ну мальчишки...
не можете помочь девушке.
Я так надеялась на вас, умных и чутких. |
|
Хлор |
Отправлено: 05.12.2004, 15:23 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 78
|
В папке билдера есть examples\apps\procview
Так вот, там пример как получить список всех процессов и их PID.
Потом сравниваешь их с PID своего процесса и все......
Хотя наверно стоит сделать с хуком красивей будет
Да и еще насколько я помню, то CommandLine в CreateProcess используем при запуске 16 рязрядных DOS приложений.
А для 32 используем ApplicationName...
Или меня портачит в связи с затянувшимися праздниками ?
|
|
Gedeon |
Отправлено: 06.12.2004, 08:53 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Вот про совершенно полезнейшую функцию-то я и позабыл
CODE |
#include <process.h>
char *File = "C:\\1.exe";
spawnlp(P_WAIT,File,"",NULL); // сделает то что Вам надо и всего 1 строка |
Что-то с памятью моей стало ...
Отредактировано Gedeon — 06/12/2004, 09:56
|
|
Konstantine |
Отправлено: 06.12.2004, 10:19 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
Gedeon, это — ДОСовая функция и её тут лучше не использовать...
список процессов тоже не нужЁн...
lolitesr, Я ещё в птн, сразу пришёл и сделал, а взять забыл — хорошо с парнями посидели шо аж сушит щас
суть примерно помню... 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
|
|