Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пробуждение родительского процесса.

19K
05 августа 2006 года
Andriod
6 / / 05.08.2006
Здравствуйте. Столкнулся со следующей проблемой:
Имеется процесс А, изменить (переписать) который нет возможности. Этот процесс запускает с ожиданием завершения процесс B (изменить который возможность есть).
Необходимо сделать так, чтобы процесс A не ожидал завершения B, а продолжал исполняться.
Буду благодарен за любые решения.
354
05 августа 2006 года
ШпиЁн
468 / / 19.02.2006
Я конечно, не супер-спец.... но все же думаю что из процесса В ничего не сделаешь...

Скорее всего процесс А дожидается выполнения процесса В с помощью функции WaitForSingleObject. Второй параметр у нее стоит при этом INFINITE, то есть ждать она будет бесконечно - пока ее первый параметр(хэндл процесса) не перейдет в signal state (функция вернет WAIT_OBJECT_0).

Может просто в процессе А используя инжектирование перехватить эту функцию и подменить у нее второй параметр(если он INFINITE) на 10мс например... тогда функция будет ждать только 10 мс, и потом отдаст управление главной программе...

У меня больше мыслей нет по этому поводу, если есть тут спецы - они должны помочь...
19K
05 августа 2006 года
Andriod
6 / / 05.08.2006
Спасибо.
Мне тоже кажется что ничего из B не сделать :( ... Вот если бы можно было послать родителю (A) сигнал, что дочерний процесс (B) завершен... но такого сигнала я в MSDN не обнаружил.
P.S. Если кто-то точно знает что ничего уже не поможет - отпишите пожалуйста тоже :)
1.8K
05 августа 2006 года
_const_
229 / / 26.11.2003
А нельзя по-простому? Процессу B вводим некий флажок (хоть через параметр командной строки), работающий след. образом. Процесс А запускает В без этого флажка. При старте В проверяет, установлен ли флаг. Если нет, то В запускает новую копию себя с установленным флажком и завершается (А продолжает выполняться), если установлен - работает обычным образом.
19K
06 августа 2006 года
Andriod
6 / / 05.08.2006
[QUOTE=_const_]А нельзя по-простому? [/QUOTE]
К сожалению, нельзя. Процесс А видимо ждёт завершения всех потомков. К примеру, если в качестве процесса B использовать cmd.exe и запусть из cmd calc то A 'проснётся' только по завершении и cmd и calc.
Я не очень хорошо разбираюсь в процессах windows, может ли процесс симулировать свою смерть, скажем, оправкой какого-либо сигнала? Или может ли B запустить процесс С, но таким образом, чтобы C не был потомком А?
P.S. Буду признателен если тыкните в хорошую доку по устройству процессов в windows.
Спасибо.
1.8K
06 августа 2006 года
_const_
229 / / 26.11.2003
Дело в том, что не существует всех потомков. Скорее всего процесс А использует job. Тогда действительно все дочерние процессы попадают в этот job, а процесс А ждет завершения работы всех процессов в job. Симулировать свою смерть процесс не может. Перехват всех Wait-ф-ций у процесса А - ОЧЕНЬ большой геморрой. Попробуй использовать ShellExecute вместо CreateProcess в процессе В (вариант с флажком).
19K
06 августа 2006 года
Andriod
6 / / 05.08.2006
[QUOTE=_const_]. Попробуй использовать ShellExecute вместо CreateProcess в процессе В (вариант с флажком).[/QUOTE]
Попробовал. Не помогло.
1.8K
06 августа 2006 года
_const_
229 / / 26.11.2003
Обидно, но не удивительно. В общем, надо найти способ запустить третий процесс, не связанный с В. Посмотри подробнее Shell, может там что есть. Еще можно попробовать создать третье приложение в виде COM-сервера - он вроде запускается системой.
На крайний случай можно создать ждущий процесс, запускаемый с системой и создающий некий именованный Event. Сигналом к активным действиям будет выставление этого Event'а.
Других идей пока нет.

PS
А есть уверенность, что А не ждет каких-либо конкретных данных? И если нет, то есть ли необходимость бороться с такой защитой?
19K
06 августа 2006 года
Andriod
6 / / 05.08.2006
Конкретизирую задачу: Имеется плагин для IE. Пишу инсталлер/анинсталлер для него. Проблема с анинсталлером. В случае, если IE запущен, удалить плагин нет возможности. Заказчик категорически против соообщения пользователю типа 'Закройте IE'. Так же против удаления плагина только после перезагрузки. Остаётся лишь ждать закрытия IE и после этого удалять файлы. Тут и возникает проблема:
add/remove programs запускает анинсталлер с ожиданием завершения. Получается, что анинсталлер или любой порождённый им процесс блокирует окно add/remove programs. Соответственно, ожидание закрытия IE блокирует это окно.
Надеюсь, понятно изложил.
Спасибо.
1.8K
07 августа 2006 года
_const_
229 / / 26.11.2003
Понятно.
В общем все подтвердилось - процесс действительно попадает в Job.
Обходится через COM (проверено в WinXP Pro SP2). Вот пример.
Код:
#include <conio.h>
#include <iostream>
#include <exception>
#include <windows.h>

using namespace std;

class CTextException : public exception
{
    string m_strText;
public:
    CTextException(const char *szText) : m_strText(szText) {};
    virtual const char *what() const throw() { return m_strText.c_str(); };
};

int main(int argc, char* argv[])
{
    CLSID wordCLSID;
    IUnknown *pUnk = NULL;

    CoInitialize(NULL);

    try
    {
        if (FAILED(CLSIDFromProgID(L"Word.Application", &wordCLSID)))
            throw CTextException("CLSIDFromProgID");
        if (FAILED(CoCreateInstance(wordCLSID, NULL,
                                    CLSCTX_LOCAL_SERVER,
                                    IID_IUnknown, (LPVOID *)&pUnk)))
            throw CTextException("CoCreateInstance");
    }
    catch (exception& e)
    {
        cout << "ERROR: " << e.what() << endl;
    }
    if (pUnk)
        pUnk->Release();
    CoUninitialize();
    cout << "Done." << endl;
    _getch();

    return 0;
}


Наличие запущенного ворда смотрим через TaskManager (у меня ворд XP не выгружается при pUnk->Release()).
Осталось дело за малым - написать свой uninstaller с использованием COM.
19K
07 августа 2006 года
Andriod
6 / / 05.08.2006
Большое спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог