我有一个我用 c++ (atl) 编写的 ie 扩展,问题是每次我打开一个新选项卡时,我的扩展的一个新实例都在运行。我需要一种方法来知道是否有一个实例已经在运行。
我想使用互斥锁:
if(!Utils::IsAddonMutexRunning())
{
aHandle = Utils::CreateAddonMutex();
}
当 IE 退出时:
STDMETHODIMP cMyAddon::OnQuit()
{
if(m_pAddon!=NULL)
{
Utils::ReleaseMutex(aHandle);
m_pAddon->Quit();
}
return S_OK;
}
问题是互斥锁永远不会被释放,因为 onQuit 没有被解雇。
有什么想法或其他解决方案吗?
编辑:
问题是当我检查互斥锁是否存在时,感谢盛的回答。
我在 SetSite 方法中调用了 if(!Utils::IsAddonMutexRunning()) :
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;
}