【问题标题】:C++ BHO: Detect the an instance of my extension if already running or notC++ BHO:检测我的扩展的实例是否已经运行
【发布时间】:2013-04-30 23:43:11
【问题描述】:

我有一个用 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;
}

【问题讨论】:

标签: c++ internet-explorer bho


【解决方案1】:

我可能太天真了,因为我以前从未开发过 IE 插件,但是您是否尝试过带有 Global\ 命名空间的 WINAPI 等效 CreateMutex

当拥有互斥锁的线程退出时,互斥锁会被自动释放。

http://msdn.microsoft.com/en-au/library/windows/desktop/ms682411%28v=vs.85%29.aspx

【讨论】:

  • 嗨,这给了我保存结果,我创建了一个互斥锁,我无法再释放它。 :(
  • 你可能需要 fork 一个特定于插件的线程来保证互斥体的生命周期。
猜你喜欢
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多