Home

Advertisement

Customize

Aug. 19th, 2007

Мьютексы, Сверхглобальные переменные C++

Одна фраза в задании поставила работу в тупик:
"при следующем запуске IE (полном новом запуске)"
Получается, что необходимо определить, что:
а) ИЕ уже запущен
б) В нем аддон уже произвел некие действия
Так как результат этих неких действий влияет на то, как дальше должен работать аддон.


Первое на что наткнулся в интернете - Mutex.
Его использование позволяет синхронизировать действие процессов, в частности самое простое применение, проверка, что процесс уже запущен:
BOOL WeAreAlone (LPSTR szName)
{
HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return FALSE;
}
return TRUE;
}

И в начале WinMain или main -

if (WeAreAlone ("Some_Unique_Name_Or_Other"))
{
// Proceed
}
else
{
MessageBox (NULL,"Error","Error: app already running!",MB_OK|MB_ICONERROR);
exit(1);
}

Это как раз то, то надо в пункте а), но вот с реализацией пункта б) - проблема, никаких данных у Mutex кроме его имени нет, кроме того, я так подозреваю, что если я закрою первый экземпляр программы и потом открою третий, то Mutexа не будет, что не есть гут.


Поэтому стал искать что-то что позволяет передавать данные между процессами.
Один из вариантов - посылать сообщения - очевиден, но достаточно сложен в реализации, хотелось чего-то попроще. И это попроще нашлось:
Сверхглобальные переменные. Или если правильнее - глобальные переменные в разделяемой секции. Создаются следующим образом:
#pragma data_seg("updateseg")
int update_st = 0;
#pragma data_seg ()
#pragma comment(linker, "/SECTION:updateseg,RWS")

После чего используются, как обычные глобальные переменные, с одним НО: они общие для всех экземпляров нашей программы.
Этот вариант удовлетворяет как а), так и б).

Advertisement

Customize