【问题标题】:SetWinEventHook crahes IE when used in BHO (Browser Helper Object)SetWinEventHook 在 BHO(浏览器帮助对象)中使用时会导致 IE 崩溃
【发布时间】:2012-08-23 14:17:08
【问题描述】:

我有一个 C# BHO,它设置了一个钩子,以便我可以跟踪 IE 何时获得焦点:

public class BHO : IObjectWithSite, IOleCommandTarget
{
    delegate void WinEventDelegate(IntPtr hWinEventHook,
       uint eventType, IntPtr hwnd, int idObject,
       int idChild, uint dwEventThread, uint dwmsEventTime);

    const uint WINEVENT_OUTOFCONTEXT = 0;
    const uint EVENT_SYSTEM_FOREGROUND = 3;

    [DllImport("user32.dll")]
    static extern bool UnhookWinEvent(IntPtr hWinEventHook);
    [DllImport("user32.dll")]
    static extern IntPtr SetWinEventHook(uint eventMin,
        uint eventMax, IntPtr hmodWinEventProc,
        WinEventDelegate lpfnWinEventProc, uint idProcess,
        uint idThread, uint dwFlags);

   private static IntPtr m_hhook; 


       ............

        m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
           EVENT_SYSTEM_FOREGROUND, IntPtr.Zero,
           WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);



       ............


   void WinEventProc(IntPtr hWinEventHook, uint eventType,
             IntPtr hwnd, int idObject, int idChild,
             uint dwEventThread, uint dwmsEventTime)
    {

    }

它工作了一段时间,然后 IE 崩溃并显示“尝试读取或写入受保护的内存。这通常表明其他内存已损坏”

请注意,即使 WinEventProc 中没有任何内容,它也会崩溃(如上所示)。如果我不设置钩子,它永远不会崩溃。

有什么想法吗?

【问题讨论】:

    标签: winapi interop internet-explorer-9 com-interop bho


    【解决方案1】:

    您的回调委托可能会被 GC 处理。不要使用自动委托创建功能,而是创建一个显式委托,将其传递给 SetWinEventHook,然后将其保留在实例成员中,直到完成。

    代码可能类似于:

    // In the class...
    WinEventDelegate m_wineventprocDelegate;
    
    
    // When you register the hook...
    m_wineventprocDelegate = new winEventDelegate(WinEventProc);
    
    // Pass in the delegate instead of WinEventProc
    m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
           EVENT_SYSTEM_FOREGROUND, IntPtr.Zero,
           m_wineventprocDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);
    

    让成员引用的委托可以防止它被收集。

    【讨论】:

    • 有人在 SO 上对我说过的最好的事情 :) - 很高兴它奏效了!
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多