用COM的时候    
public IDispEventSimpleImpl<1,CAddin,     
         &__uuidof(MSWord::ApplicationEvents2)>但我现在用的是Automation编程
我就不知道IDispEventSimpleImpl 怎么用了啊。

解决方案 »

  1.   

    //autolook add-in ,same for word add-in
    ATL提供了二种模板类IDispEventImpl<>和IDispEventSimpleImpl<>来实现接口事件的接收,这里我们使用IDispEventSimpleImpl来实现(因为它不需要额外的类型库信息)。它需要设置SINK(接收)映射,通过_ATL_SINK_INFO结构来回调参数信息,最终通过DispEventAdvise和DispEventUnadvise来与源接口连接或断开。实现方法如下:
    1. 在COutlookAddin继承类中加入IDispEventSimpleImpl继承,代码如下:
    class ATL_NO_VTABLE COutlookAddin : 
     public CComObjectRootEx<CComSingleThreadModel>,
     ……
     public IDispEventSimpleImpl<1,COutlookAddin,&__uuidof(Office::_CommandBarButtonEvents)>2. 声明_ATL_SINK_INFO结构回调参数信息。在OutlookAddin.h文件中加入下面语句:
    // 按钮事件响应信息声明
    extern _ATL_FUNC_INFO OnClickButtonInfo;  在OutlookAddin.cpp文件中加入定义语句,如下:
       // 按钮事件响应信息定义
    _ATL_FUNC_INFO OnClickButtonInfo ={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}};3. 加入Sink映射,如下:
    EGIN_SINK_MAP(COutlookAddin)
     SINK_ENTRY_INFO(1, __uuidof(Office::_CommandBarButtonEvents),/*dispid*/ 0x01, OnClickButton1, &OnClickButtonInfo)
     SINK_ENTRY_INFO(2, __uuidof(Office::_CommandBarButtonEvents),/*dispid*/ 0x01, OnClickButton2, &OnClickButtonInfo)
     SINK_ENTRY_INFO(3, __uuidof(Office::_CommandBarButtonEvents),/*dispid*/ 0x01, OnClickMenu, &OnClickButtonInfo)
    END_SINK_MAP()4. 加入事件涵数。在OutlookAddin.h中加入声明:
    void __stdcall OnClickButton1(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault);在OutlookAddin.cpp中加入实现:
    // 工具条按钮1点击事件响应涵数
    void __stdcall COutlookAddin::OnClickButton1(IDispatch* /*Office::_CommandBarButton* */ Ctrl,VARIANT_BOOL * CancelDefault)
    {
     USES_CONVERSION;
     CComQIPtr<Office::_CommandBarButton> pCommandBarButton(Ctrl);
      
     HINSTANCE result=ShellExecute(NULL, _T("open"), _T("http://www.vckbase.com"), NULL,NULL, SW_SHOW);
    }5. 最后,打开或断开与接口的连接。方法如下:
    l 在OnConnection接口涵数的最后部分,加入下面代码来打开连接:
    CommandButton1Events::DispEventAdvise((IDispatch*)m_spButton);
    l 在OnDisconnection接口涵数中,加入下面代码来断开连接:
    CommandButton1Events::DispEventUnadvise((IDispatch*)m_spButton);
      

  2.   

    To kingzai(stevenzhu)
      你说的方法我知道,那是COM编程,我现在用的是 Automation啊  
    public IDispEventSimpleImpl<1,COutlookAddin,&__uuidof(Office::_CommandBarButtonEvents)>&__uuidof(Office::_CommandBarButtonEvents 我没法声明啊
      

  3.   

    帮忙顶一下,顺便问问,我做了一个类似word的addins如何自动加入到word的工具栏中呀?
      

  4.   

    加工具条很多Sample的去www.vckbase.net 找,就有