程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> IE編程---DLL綁定

IE編程---DLL綁定

編輯:.NET實例教程
IE的啟動過程:
當IE的實例啟動的時候,它會在注冊表中尋找一個CLSID,具體位置在
HKEY_LOCALL_MacHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects
當這裡存在一CLSID時,IE會建立一個對象的實例。比如:{B5D4581D-ED6A-4905-A267-25BAF7BE79C1}如果這個看不懂,你可以去找一下COM開發的書。
開發實例:
VC建立工程,ALT COM AppWizard 注意是DLL.
建立一個新的類,一定要是ALT
在菜單,Insert>New ALT Object:Simple Object
修改並實現方法
// FiltrateIE.h : Declaration of the CFiltrateIE


#ifndef __FILTRATEIE_H_
#define __FILTRATEIE_H_
#include "resource.h"       // main symbols
#include <ExDisp.h> //這裡必須加上這兩個頭文件
#include <msHtml.h>


#define       MAX_DOCUMENTS       50
/////////////////////////////////////////////////////////////////////////////
// CFiltrateIE
class ATL_NO_VTABLE CFiltrateIE :
       public CComObjectRootEx<CComSingleThreadModel>,
       public CComCoClass<CFiltrateIE, &CLSID_FiltrateIE>,
       public IObjectWithSiteImpl<CFiltrateIE>,//加入這個,以繼承該接口
       public IDispatchImpl<IFiltrateIE, &IID_IFiltrateIE, &LIBID_SAFEIELib>
{
public:
       CFiltrateIE()
       {
       }


DECLARE_REGISTRY_RESOURCEID(IDR_FILTRATEIE)
DECLARE_NOT_AGGREGATABLE(CFiltrateIE)
DECLARE_PROTECT_FINAL_CONSTRUCT()


BEGIN_COM_MAP(CFiltrateIE)
       COM_INTERFACE_ENTRY(IFiltrateIE)
       COM_INTERFACE_ENTRY(IDispatch)
       COM_INTERFACE_ENTRY(IObjectWithSite)//加入
END_COM_MAP() 
// IFiltrateIE
public
//下面兩個方法必須實現
STDMETHOD(SetSite)(IUnknown *pUnkSite);
STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, Word wFlags,
                                          DISPPARAMS * pdispparams, VARIANT * pvarResult,
                                          EXCEPINFO * pexcepinfo, UINT * puArgErr);
private:
//下面一個方法必須實現
   enum ConnectType {Advise,Unadvise};
   BOOL ManageConnection(enum ConnectType action);
   CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;
   HWND       m_hwndIE;
   DWord m_dwCookIE;
   BOOL       m_bDocComplete;
   BOOL m_test;
};


#endif //__FILTRATEIE_H_
// FiltrateIE.cpp : Implementation of CFiltrateIE
#include "stdafx.h"
#include "SafeIE.h"
#include "FiltrateIE.h"


#include <tchar.h>
#include <ExDisp.h>
#include <ExDispID.h>
#include <comdef.h>
#include <Commctrl.h>
#include <strstrea.h>
/////////////////////////////////////////////////////////////////////////////
// CFiltrateIE
BOOL CFiltrateIE::ManageConnection(enum ConnectType action)
{
       if (!m_spWebBrowser2)
              return S_OK;


       HRESULT hr;


       CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer> spCPContainer(m_spWebBrowser2);


       if (spCPContainer != NULL)
       {
              CComPtr<IConnectionPoint> spConnectionPoint;


              hr = spCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &spConnectionPoint);
              if (SUCCEEDED(hr))
              {
                     if (action == Advise)
                            // Advise the clIEnt site that we want to sink events
                            hr = spConnectionPoint->Advise((IDispatch*)this, &m_dwCookIE);
                &nbsp;    else
                            // Remove us from the list of active sinks
                            hr = spConnectionPoint->Unadvise(m_dwCookIE);
              }
       }
      
       return (SUCCEEDED(hr));
}

STDMETHODIMP CFiltrateIE::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, Word wFlags,
                                DISPPARAMS* pDispParams, VARIANT* pvarResult,
                                EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
       m_test=TRUE;
       if (!pDispParams)
              return E_INVALIDARG;


       CComPtr<IDispatch> spDisp;
       HRESULT hr;


       switch (dispidMember)
       {
           case DISPID_BEFORENAVIGATE2:


                     m_bDocComplete = FALSE;
                     m_spWebBrowser2 = pDispParams->rgvarg[6].pdispVal;


                     hr = m_spWebBrowser2->get_Document(&spDisp);
                     if (SUCCEEDED(hr))
                     {
                 &nbsp;  
                            CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHtml;
                            spHtml = spDisp;


                     //       if (spHtml)
                            //       RemoveDocument(spHtml);
                     }
                     break;
             


              case DISPID_NAVIGATECOMPLETE2:


                     //
/*                  if (m_spWebBrowser2){
                                   _bstr_t bsAddress=m_spWebBrowser2->GetLocationURL();
                             LPCTSTR str1,str2;
           &nbsp;                       str1="SolarSafe.htm";
                                   str2=(LPCTSTR)bsAddress;
                             if (strstr(,str1)!=NULL)
                                   {
                                    ShellExecute((HWND)m_spWebBrowser2->HWND,"open","C:\\solarsafe.htm",NULL,NULL,SW_SHOWNORMAL);
                                   }
*/   
                     break;
             
              // [0]: New status bar text - VT_BSTR
              //
              /*
              case DISPID_STATUSTEXTCHANGE:
                     break;
       &nbs

p;      */
             
              // [0]: Maximum progress - VT_I4
              // [1]: Amount of total progress - VT_I4
              //
              /*
              case DISPID_PROGRESSCHANGE:
                     break;
              */
             
              // [0]: Document URL - VT_BYREF|VT_VARIANT
              // [1]: An object that evaluates to the top-level or frame
              //      WebBrowser object corresponding to the event.
              case DISPID_DOCUMENTCOMPLETE:
       // Temporarily disable keyboard hook
       if(m_test)
                     {//ShellExecute(m_hwndIE,"open","C:\\solarsafe.htm",NULL,NULL,SW_SHOWNORMAL);
                  MessageBox(m_hwndIE, "AAAA", "A", MB_OK );
       //            m_spWe bBrowser2->Quit();
                  m_test=FALSE;
                     }
                     // Fill in form if necessary
                     m_spWebBrowser2 = pDispParams->rgvarg[1].pdispVal;


                     // Get the WebBrowser''s document object
                     hr = m_spWebBrowser2->get_Document(&spDisp);
                     if (SUCCEEDED(hr))
                     { 
                           
                            CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHtml;
                            spHtml = spDisp;
           //            if (spHTML && DoFillIn(spHtml))>
              //                   AddDocument(spHtml);
                     }
                    


                     m_bDocComplete = TRUE;
                     // Temporarily disable keyboard hook
             


                     break;


              // No parameters
              /*
              case DISPID_DOWNLOADBEGIN:
                     break;
              */
             
              // No parameters
              /*
              case DISPID_DOWNLOADCOMPLETE:
                     break;
       &nbsp;      */
             
              // [0]: Enabled state - VT_BOOL
              // [1]: Command identifIEr - VT_I4
              //
              /*
              case DISPID_COMMANDSTATECHANGE:
                     break;
              */
             
              // [0]: Address of cancel flag - VT_BYREF|VT_BOOL
              //
              /*
              case DISPID_NEWWINDOW2:
                     break;
              */
             
              // [0]: Document title - VT_BSTR
              // [1]: An object that evaluates to the top-level or frame
              //      WebBrowser object corresponding to the event.;         //
              /*
              case DISPID_TITLECHANGE:
                     break;
              */


              // [0]: Name of property that changed - VT_BSTR
              //
              /*
              case DISPID_PROPERTYCHANGE:
                     break;
           &n*/


              // [0]: Address of cancel flag - VT_BYREF|VT_BOOL
              //
              case DISPID_ONQUIT:
                     // Unregister the keyboard hook previously installed
                     // for this instance.
                 ManageConnection(Unadvise);
 


                     break; 


              default:
 
                     break;
       }


       return S_OK;
}


STDMETHODIMP CFiltrateIE::SetSite(IUnknown *pUnkSite)
{
     if (pUnkSite != NULL)
       {
              // Query pUnkSite for the IWebBrowser2 interface.
              m_spWebBrowser2 = pUnkSite;


              if (m_spWebBrowser2)
              {
                     m_spWebBrowser2->get_HWND((long*) &m_hwndIE);


                     // We''ll need the this pointer later when the keyboard
                     // hook will be called.
              //     if (!AddInstance(m_hwndIE, this, GetCurrentThreadId()))
                     //       FormWhizError(IDS_ERROR_TOOMUCHWindows, errError);


               &nbsp;     // Connect to the browser in order to handle events.
                     if (!ManageConnection(Advise))
                            MessageBox(m_hwndIE, "AAAA", "A", MB_OK );
                            //       FormWhizError(IDS_ERROR_SINKINGFAILED, errError);
              }


      
       }


       return S_OK;
}


找到.rgs文件,加入
HKLM
{
       SOFTWARE
       {
              Microsoft
              {    
                     Windows
                     {
                            CurrentVersion
                            {
                     &nbsp;             Explorer
                                   {
                     &nbs                ''Browser Helper Objects''
                                          {
                                                 ForceRemove {B5D4581D-ED6A-4905-A267-25BAF7BE79C1} = s ''SafeIE Utility''
                                          }
                                   }
                            }
                     }
              }
       }
}
上邊的{B5D4581D-ED6A-4905-A267-25BAF7BE79C1}在這個文件中可以找到,注意,你做的CSLID肯定不一樣。一切OK,想試一下,可以先看一下,本工程代碼 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved