Как избежать запуска нескольких экземпляров приложения
От: Алексей Остапенко Россия  
Дата: 05.08.02 07:24
Оценка: 350 (12) +1
Статья:
Dr. Joseph M. Newcomer. Как избежать запуска нескольких экземпляров приложения
Автор(ы): Dr. Joseph M. Newcomer
Дата: 17.02.2001

В статье подробно рассматриваются различные способы ограничения числа запущенных копий приложения одной. Указываются недостатки и даже ошибки во многих известных методах решения задачи, которые постоянно фигурируют в конференциях и в Сети. Кроме того, указывает на различные трактовки понятия "одна копия приложения" и демонстрирует правильное решение для каждого из случаев.


Авторы:
Алексей Остапенко

Аннотация:
В статье подробно рассматриваются различные способы ограничения числа запущенных копий приложения одной. Указываются недостатки и даже ошибки во многих известных методах решения задачи, которые постоянно фигурируют в конференциях и в Сети. Кроме того, указывает на различные трактовки понятия "одна копия приложения" и демонстрирует правильное решение для каждого из случаев.
"Будь достоин победы" (c) 8th Wizard's rule.
?
От: e-smirnov  
Дата: 25.12.02 11:12
Оценка:
А почему вместо всего этого не использовать обычный мьютекс?
Mirosoft делает неправильно ?
От: Слава Израиль  
Дата: 07.09.02 09:43
Оценка:
Понятно, что это перевод, но хотелось бы знать: если Маэстро пишет некорректно, то почему я никогда не видел два окна, например Word или Visual Studio.
Спасибо за внимание
Поправка
От: Reverend JAHncle Россия  
Дата: 06.08.02 07:24
Оценка:
Не SMTO_ABORT_IF_HUNG, а SMTO_ABORTIFHUNG.
Re: Mirosoft делает неправильно ?
От: Алексей Владимирович Миронов Россия  
Дата: 17.07.03 12:37
Оценка: +1
Здравствуйте, Слава, Вы писали:

С>Понятно, что это перевод, но хотелось бы знать: если Маэстро пишет некорректно, то почему я никогда не видел два окна, например Word или Visual Studio.


Вы просто не пробовали.
... << RSDN@Home 1.0 beta 6a >>
Re: Как избежать запуска нескольких экземпляров приложения
От: KGP http://kornilow.newmail.ru
Дата: 18.07.03 06:13
Оценка:
Здравствуйте, Алексей Остапенко, Вы писали:

АО>Статья:

АО>Dr. Joseph M. Newcomer. Как избежать запуска нескольких экземпляров приложения

АО>Авторы:

АО> Алексей Остапенко

Авторы: ... их один и это автор перевода
Re[2]: Как избежать запуска нескольких экземпляров приложени
От: Lexey Россия  
Дата: 18.07.03 07:43
Оценка:
Здравствуйте, KGP, Вы писали:

АО>>Статья:

АО>>Dr. Joseph M. Newcomer. Как избежать запуска нескольких экземпляров приложения

АО>>Авторы:

АО>> Алексей Остапенко

KGP> Авторы: ... их один и это автор перевода


Сообщение очевидно автосгенерированное, причем сгенерировано криво.
"Будь достоин победы" (c) 8th Wizard's rule.
Re: Как избежать запуска нескольких экземпляров приложения
От: abacus  
Дата: 02.06.04 14:29
Оценка:
Здравствуйте, Алексей Остапенко, Вы писали:

АО>Статья:



АО>Авторы:

АО> Алексей Остапенко

АО>Аннотация:

АО>В статье подробно рассматриваются различные способы ограничения числа запущенных копий приложения одной. Указываются недостатки и даже ошибки во многих известных методах решения задачи, которые постоянно фигурируют в конференциях и в Сети. Кроме того, указывает на различные трактовки понятия "одна копия приложения" и демонстрирует правильное решение для каждого из случаев.

Сейчас понадобилось `нечто подобное. Прочитал, и в одном месте у меня возникли смутные сомнения.
В последнем BOOL CMyApp::InitInstance() разве не надо вместо
AlreadyRunning = (GetLastError() == ERROR_ALREADY_EXISTS);

сделать, как в более раннем примере
AlreadyRunning = ( ::GetLastError() == ERROR_ALREADY_EXISTS || ::GetLastError() == ERROR_ACCESS_DENIED);


пример

#pragma comment(linker, "/SECTION:.shr,RWS")
#pragma data_seg(".shr")
HWND hGlobal = NULL; // кстати hGlobal и g_hWnd это одно и тоже ?
#pragma data_seg()

// в коде инициализации:
// g_hWnd устанавлвается после создания главного окна.

BOOL CMyApp::InitInstance()
{
    bool AlreadyRunning;

    HANDLE hMutexOneInstance = ::CreateMutex( NULL, TRUE, createExclusionName("MYAPPNAME-088FA840...", UNIQUE_TO_TRUSTEE));

    // не получиться ли здесь для разных сессий под одной учетной записью, что GetLastError() вернет ERROR_ACCESS_DENIED ?

    AlreadyRunning = (GetLastError() == ERROR_ALREADY_EXISTS);

    if (hMutexOneInstance != NULL) 
    {
        ::ReleaseMutex(hMutexOneInstance);
    }
    if ( AlreadyRunning )
    { /* активизируем окно работающего экземпляра */
        HWND hOther = g_hWnd; 
        if (hOther != NULL)
        { /* помещаем окно поверх других */
            ::SetForegroundWindow(hOther);
            if (IsIconic(hOther))
            { /* разворачиваем окно */
                ::ShowWindow(hOther, SW_RESTORE);
            } /* разворачиваем окно */
        } /* помещаем окно поверх других */

        return FALSE; // заканчиваем выполнение
    } /* активизируем окно работающего экземпляра */

    // ... продолжение InitInstance

    return TRUE;
} // CMyApp::InitInstance
Re[2]: Как избежать запуска нескольких экземпляров приложени
От: Lexey Россия  
Дата: 09.06.04 14:20
Оценка:
Здравствуйте, abacus, Вы писали:

A>Сейчас понадобилось `нечто подобное. Прочитал, и в одном месте у меня возникли смутные сомнения.

A>В последнем BOOL CMyApp::InitInstance() разве не надо вместо

Я не автор, а переводчик. Такие вопросы нужно автору задавать.

A>
A>AlreadyRunning = (GetLastError() == ERROR_ALREADY_EXISTS);
A>

A>сделать, как в более раннем примере
A>
A>AlreadyRunning = ( ::GetLastError() == ERROR_ALREADY_EXISTS || ::GetLastError() == ERROR_ACCESS_DENIED);
A>


A>пример


A> // не получиться ли здесь для разных сессий под одной учетной записью, что GetLastError() вернет ERROR_ACCESS_DENIED ?


AFAIK, если специально не извращаться, то под одной учетной записью ты ACCESS_DENIED никак не получишь.
... << RSDN@Home 1.1.3 stable >>
"Будь достоин победы" (c) 8th Wizard's rule.
Re: Как избежать запуска нескольких экземпляров приложения
От: _Winnie Россия C++.freerun
Дата: 02.08.07 14:51
Оценка:
Здравствуйте, Алексей Остапенко, Вы писали:

Неожиданная багофича:
GetUserObjectInformation для GetThreadDesktop под разными рабочими столами у разных юзеров возвращает строку "Default".
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Зачем такие сложности?
От: _Winnie Россия C++.freerun
Дата: 02.08.07 20:29
Оценка:
Зачем такие сложности?
Вроде функции создания именованных объектов ядра Create* автоматически создадут имя в Local\ namespace на компьютере с Fast User Switching.
Сейчас для теста создал мьютекс, запуск проверки запуска приложения из под одного пользователя не мешает запускать его из под другого.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Как избежать запуска нескольких экземпляров приложения
От: Gibbel Россия  
Дата: 25.08.09 09:47
Оценка: :))
Отмечу, что в предложенной функции createExclusionName используются функции, реализованные только в линейке Windows NT. Поэтому, для гарантированной работы приложения во всех версиях Windows, эти функции стоит подключать динамически через LoadLibrary/GetProcAddress.
Re: Как избежать запуска нескольких экземпляров приложения
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.08.09 12:00
Оценка:
Здравствуйте, Алексей Остапенко, Вы писали:

АО>В статье подробно рассматриваются различные способы ограничения числа запущенных копий приложения одной. Указываются недостатки и даже ошибки во многих известных методах решения задачи, которые постоянно фигурируют в конференциях и в Сети. Кроме того, указывает на различные трактовки понятия "одна копия приложения" и демонстрирует правильное решение для каждого из случаев.


Вообще говоря, не надо этим увлекаться. А то несколько бесит, когда программы, которым логически ничего бы не мешало работать в нескольких копиях, тем не менее упорно отказываются запускаться в таком режиме.
Re[2]: Как избежать запуска нескольких экземпляров приложени
От: Pavel Dvorkin Россия  
Дата: 26.08.09 12:14
Оценка:
Здравствуйте, Gibbel, Вы писали:

G>Отмечу, что в предложенной функции createExclusionName используются функции, реализованные только в линейке Windows NT. Поэтому, для гарантированной работы приложения во всех версиях Windows, эти функции стоит подключать динамически через LoadLibrary/GetProcAddress.


Отмечу, что в предложенной функции используются средства, вообще не реализованные в Windows 3.x, поэтому для гарантированной работы приложения во всех версиях Windows даже это не поможет
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.