У меня есть расширение ie, которое я написал на c ++ (atl), и проблема в том, что каждый раз, когда я открываю новую вкладку, запускается новый экземпляр моего расширения. Мне нужен способ узнать, есть ли уже запущенный экземпляр или нет.
Я думал, используя Mutex:
if(!Utils::IsAddonMutexRunning())
{
aHandle = Utils::CreateAddonMutex();
}
И когда IE выходит:
STDMETHODIMP cMyAddon::OnQuit()
{
if(m_pAddon!=NULL)
{
Utils::ReleaseMutex(aHandle);
m_pAddon->Quit();
}
return S_OK;
}
Проблема в том, что мьютекс никогда не освобождается, потому что onQuit не запускается.
Есть идеи или другие решения?
Редактировать:
проблема была, когда я проверил, существует ли мьютекс, благодаря ответу Шэна.
Я вызвал if (! Utils :: IsAddonMutexRunning ()) в методе SetSite:
bool Utils::IsAddonMutexRunning()
{
HANDLE hMutexOneInstance = ::CreateMutex( NULL, FALSE,
_T("MYADDONMUTEX2013_____"));
DWORD retVal = WaitForSingleObject(hMutexOneInstance, 0);
bool ret = (retVal == WAIT_OBJECT_0 || retVal == WAIT_ABANDONED);CloseHandle(hMutexOneInstance);
return !ret;
}
Я могу быть наивным, так как раньше я никогда не разрабатывал плагин для IE, но вы пробовали использовать аналог WINAPI? CreateMutex
с Global\
Пространство имен?
При выходе из потока, владеющего мьютексом, мьютекс будет автоматически освобожден.
http://msdn.microsoft.com/en-au/library/windows/desktop/ms682411%28v=vs.85%29.aspx
Других решений пока нет …