我有一个我用c ++(atl)编写的ie扩展,问题是每次打开一个新标签时,我的扩展的新实例都在运行。我需要一种方法来了解是否有一个实例已经运行。
我想过使用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没有被解雇。
任何想法或其他解决方案?
编辑:
问题是当我检查互斥锁是否存在时,感谢盛的回答。
我在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;
}
答案 0 :(得分:0)
我可能很天真,因为我以前从未为IE开发插件,但您是否尝试过使用CreateMutex
命名空间的WINAPI等效Global\
?
当拥有互斥锁的线程退出时,互斥锁将自动释放。
http://msdn.microsoft.com/en-au/library/windows/desktop/ms682411%28v=vs.85%29.aspx