Мьютексы, Сверхглобальные переменные 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")
После чего используются, как обычные глобальные переменные, с одним НО: они общие для всех экземпляров нашей программы.
Этот вариант удовлетворяет как а), так и б).
