网上搜到了监听EnvDTE::_DocumentEvents方法都是使用C#的方式的
使用C++,需要先获得EnvDTE::_DocumentEvents对象后给其Advise一个sink,但通过EnvDTE::Events获得EnvDTE::_DocumentEvents时需要传入一个EnvDTE::Document对象,表示是对哪个Document的事件进行监听。C#中传入一个MissValue,猜测C++中是传入一个NULL。
实验后,确实如此,对应的代码类似如下的样子
代码
CComPtr<EnvDTE::Events> pEvents;
m_pDTE->get_Events(&pEvents);
//CComPtr<EnvDTE::_DocumentEvents> m_pDocEvent;
pEvents->get_DocumentEvents(NULL, &m_pDocEvent);
HRESULT hr = ConnectDocumentEvents::DispEventAdvise(m_pDocEvent.p);
if (SUCCEEDED(hr))
{
//...
}
m_pDTE->get_Events(&pEvents);
//CComPtr<EnvDTE::_DocumentEvents> m_pDocEvent;
pEvents->get_DocumentEvents(NULL, &m_pDocEvent);
HRESULT hr = ConnectDocumentEvents::DispEventAdvise(m_pDocEvent.p);
if (SUCCEEDED(hr))
{
//...
}
其中ConnectDocumentEvents是一个IDispEventImpl的typedef


浙公网安备 33010602011771号