browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

用 ATL 编写 Visual Studio 的插件

Posted by on 2009 年 02 月 13 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

第一步,完善向导生成的 CConnect 类,添加事件处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ATL_NO_VTABLE CConnect :
    // 原有代码...
    public IDispEventImpl<0, CConnect, &DIID__dispDebuggerEvents, &LIBID_EnvDTE, 8, 0>
{
// 原有代码…   
public:
    BEGIN_SINK_MAP(CConnect)
        SINK_ENTRY_EX(0, DIID__dispDebuggerEvents, 0×03, OnEnterBreakMode)
    END_SINK_MAP()
 
    STDMETHOD(OnEnterBreakMode)(dbgEventReason Reason, dbgExecutionAction* ExecutionAction)
    {
        *ExecutionAction = dbgExecutionActionDefault;
        OutputDebugString(_T("OnEnterBreakMode."));
        return S_OK;
    }
private:
    CComPtr<_DebuggerEvents> m_pDbgEvents;
};

对于 Sink Map 中 dispid(0x03) 的获取,可以使用 Visual Studio 附带的 OleView 工具打开 %ProgramFiles%\Common Files\Microsoft Shared\MSEnv\dte80a.olb 即可查阅。

第二步,在 OnConnection 和 OnDisconnection 中添加注册/注销事件的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
STDMETHODIMP CConnect::OnConnection(IDispatch *pApplication, ext_ConnectMode ConnectMode, IDispatch *pAddInInst, SAFEARRAY ** /*custom*/ )
{
    HRESULT hr = S_OK;
    pApplication->QueryInterface(__uuidof(DTE2), (LPVOID*)&m_pDTE);
    pAddInInst->QueryInterface(__uuidof(AddIn), (LPVOID*)&m_pAddInInstance);
 
    // 注册调试器事件
    CComPtr<Events> spEvents;
    m_pDTE->get_Events(&spEvents);
    spEvents->get_DebuggerEvents(&m_pDbgEvents);
    DispEventAdvise(m_pDbgEvents);
 
    return hr;
}
 
STDMETHODIMP CConnect::OnDisconnection(ext_DisconnectMode /*RemoveMode*/, SAFEARRAY ** /*custom*/ )
{
    DispEventUnadvise((IUnknown*)m_pDbgEvents.p);
    m_pDbgEvents = NULL;
 
    m_pDTE = NULL;
    m_pAddInInstance = NULL;
    return S_OK;
}

这就完成了一个完整的 Visual Studio 插件,该插件将在进入调试状态时输出调试信息。

订阅本站

6 Comments

  • At 2009.02.13 15:54, likunkun said:

    学习一下,正想了解这方面的知识呢…@_@

    • At 2009.02.16 12:59, mscorp said:

      一个丁老头,欠我3毛四,还有两个蛋

      接下去咋念来着?

      • At 2009.02.19 14:16, tip said:

        请推荐一下atl方面的教程,谢谢。久久不能入门,痛苦

        • At 2009.02.19 18:52, 李马 said:

          可以看看《深入解析ATL》。

          • At 2009.11.08 13:04, fangkm said:

            李马大侠,OnConnection/OnDisconnection是在什么时候调用的啊

            • At 2009.11.09 08:53, 李马 said:

              可以实际测试一下。

              (Required)
              (Required, will not be published)