我的程序是一个ActiveX文档服务器,当用IE打开特定类型的文档时会嵌入到IE并打开文档。就像用IE打开word文档的效果一样。我想在我得程序里处理IE的open file事件和鼠标拖曳事件(拖曳文档到IE并打开),该怎么办阿?

解决方案 »

  1.   

    STDMETHODIMP CIEPlugCom::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
    {
    USES_CONVERSION;

    if(!pDispParams)
    return E_INVALIDARG;

    LPOLESTR lpURL=NULL;
    m_spWebBrowser2->get_LocationURL(&lpURL);
    switch(dispidMember)
    {
    case DISPID_BEFORENAVIGATE2:
    char *pURL;
    if(pDispParams->cArgs >=5&&pDispParams->rgvarg[5].vt==(VT_BYREF|VT_VARIANT))
    {
                CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
                varURL.ChangeType(VT_BSTR);
    //转化要访问的网址为char *型
    pURL=OLE2A(varURL.bstrVal);
    }
    //如果正要访问的网址为要被拦截的,则停止
    //IDS_URL
    if(strstr(pURL,"microsoft.com")!=NULL)
    {
                *pDispParams->rgvarg[0].pboolVal=TRUE;
        MessageBox(NULL,"当前系统禁止浏览该页","警告",MB_ICONSTOP);
    return S_OK;
    }
    break;
    case DISPID_NAVIGATECOMPLETE2:
    break;
    case DISPID_DOCUMENTCOMPLETE:
    break;
    case DISPID_DOWNLOADBEGIN:
    break;
    case DISPID_DOWNLOADCOMPLETE:
    break;
    case DISPID_NEWWINDOW2:
    READYSTATE m_ReadyState;
            m_spWebBrowser2->get_ReadyState(&m_ReadyState);
            if(m_ReadyState!=READYSTATE_COMPLETE)
            {
                *pDispParams->rgvarg[0].pboolVal=TRUE;
                return S_OK;
            }
    else
    {
                *pDispParams->rgvarg[0].pboolVal=FALSE;
                return S_OK;
    }
        break;
    case DISPID_QUIT:
    break;
    default:
    break;
    }
    return S_OK;
    }
      

  2.   

    好像不是阿,IWebBrowser2好像只处理与浏览相关的几个事件
      

  3.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=190333
    如何注册自己的协议,在IE中点击就能直接打开对应的可执行程序,类似于微软的mms协议那样的。  
    是不是跟关联文件类型一样的?  
    ---------------------------------------------------------------  
     
    http://www.codeguru.com/atl/asyncpp.shtml  
    Asynchronous  Pluggable  Protocol  Implementation  with  ATL  
    ---------------------------------------------------------------  
     
    http://msdn.microsoft.com/workshop/networking/pluggable/overview/overview.asp
      

  4.   

    贴错了
    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=53724MSDN  Home  >    MSDN  Web  &  Internet  Samples  >  Component  Development  
    Objvw  sample    
       
    HRESULT  CObjVw::SetClientSite(IOleClientSite  *pClientSite)  
    {  
               HRESULT  hr  =  S_OK;  
     
               if(NULL  !=  pClientSite)  
               {  
                           ATLTRACE(_T("SetClientSite  called\n"));  
     
                           m_spClientSite  =  pClientSite;    //  This  AddRefs  the  client  site  
                                                                                                                     //  if  null,  existing  client  site  is  released  
               }  
               else  
               {  
                           //REMOVE:  _ASSERT(0  !=  m_dwAdviseCookie);  
                           _ASSERT(m_spWebBrowser  !=  NULL);  
     
                           ATLTRACE(_T("SetClientSite  NULL  called\n"));  
     
                           //REMOVE:  hr  =  AtlUnadvise(  m_spWebBrowser,  __uuidof(SHDocVw::DWebBrowserEvents2),  m_dwAdviseCookie  );  
                             
                           IDispEventImpl<0,  CObjVw,  &__uuidof(SHDocVw::DWebBrowserEvents2),  
                                                               &LIBID_OBJVWLib,  1,  0>::DispEventUnadvise(m_spWebBrowser);  
                             
                           m_spWebBrowser.Release();  
     
                           return            S_OK;  
               }  
                 
               try  
               {  
                           IServiceProviderPtr  spSP((LPOLECLIENTSITE)m_spClientSite);  
     
                           if(NULL  ==  spSP)  
                                       return  hr;  
     
                           spSP->QueryService(__uuidof(SHDocVw::IWebBrowserApp),    
                                                   __uuidof(SHDocVw::IWebBrowser2),  (void**)&m_spWebBrowser);  
     
                           //REMOVE:  hr  =  AtlAdvise(m_spWebBrowser,  GetControllingUnknown(),  __uuidof(SHDocVw::DWebBrowserEvents2),  &m_dwAdviseCookie);  
                             
                           IDispEventImpl<0,  CObjVw,  &__uuidof(SHDocVw::DWebBrowserEvents2),  
                                   &LIBID_OBJVWLib,  1,  0>::DispEventAdvise(m_spWebBrowser);  
     
               }  
               catch(...)  
               {  
                           return  S_FALSE;  
               }  
     
               return  hr;  
    }
      

  5.   

    是这样的,我想在我的程序里监视IE事件,比如当一个用户把一份文档拖到IE的地址栏时,我截获这个消息并为这份文档打开一个新的IE窗口。这样该怎么做啊?