IE Programming --- DLL Binding
Gu Jianhui (http://solarsoft.126.com)
I have reviewed some information, but there are not many articles about the DLL binding of IE, and it is not very clear. To this end, I want to introduce this method:
Basic knowledge: VC COM, (Alt method)
The startup process of IE:
When the instance of IE is started, it will look for a CLSID in the registry, the specific location is
HKEY_LOCALL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / Explorer / Browser Helper Objects
When there is a CLSID here, IE will establish an example of an object. For example: {B5D4581D-ED6A-4905-A267-25BAF7BE79C1} If this is not understood, you can find a book developed.
Development example:
VC established project, Alt Com appwizard Note is a DLL.
Establish a new class, must be Alt
In the menu, INSERT> New Alt Object: Simple Object
Modify and implement
// filtrateie.h: Declaration of the cfiltrateie
#ifndef __filtrateie_h_
#define __filtrateie_h_
#include "resource.h" // main symbols
#include
#include
#define max_documents 50
/
// cfiltrateie
Class ATL_NO_VTABLE CFILTRATEIE:
Public CComobjectrootex
Public ccomcoclass
Public IObjectWithsiteImpl
Public IDispatchImpl
{
PUBLIC:
Cfiltrateie ()
{
}
DECLARE_REGISTRY_RESOURCEID (iDR_Filtrateie)
Declare_not_aggregatable (cfiltrateie)
Declare_protect_final_construct ()
Begin_COM_MAP (CFILTRATEIE)
COM_ITERFACE_ENTRY (ifiltrateie)
COM_ITERFACE_ENTRY (Idispatch)
COM_INTERFACE_ENTRY (IOBJECTWITHSITE) // Join
END_COM_MAP ()
// ifiltrateie
public
// The following two methods must be implemented
StdMethod (IUNKNOWN * PUNKSITE);
StdMethod (Invoke) (Dispid Dispidmember, Refiid Riid, LCID LCID, Word WFLAGS,
Dispparams * Pdispparams, Variant * Pvarresult,
Excepinfo * pEXCEPINFO, UINT * PUARGERR);
Private:
// A method must be implemented
ENUM CONNECTTYPE {Advise, Unadvise}; Bool ManageConnection (Enum ConnectType Action);
CCOMQIPTR
HWND M_HWNDIE;
DWORD M_DWCOOKIE;
BOOL M_BDOCCOMPLETE;
BOOL M_TEST;
}
#ENDIF / / __ICRATEIE_H_
// Filtrateie.cpp: Implementation of Cfiltrateie
#include "stdafx.h"
#include "safeie.h"
#include "filtrateie.h"
#include
#include
#include
#include
#include
#include
/
// cfiltrateie
Bool Cfiltrateie :: ManageConnection (Enum ConnectType Action)
{
IF (! m_spwebbrowser2)
Return S_OK;
HRESULT HR;
CCOMQIPTR
IF (spcpcontainer! = NULL)
{
CComptr
HR = spcpcontainer-> FindConnectionPoint (DIID_DWEBBBROWSEREVENTS2, & SPCONNECTIONPOINT);
En (ac))
{
IF (action == advise)
// Advise the Client Site That We want to sink events
HR = SPConnectionPoint-> Advise (iDispatch *), & m_dwcookie;
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
HRESULT HR;
Switch (Dispidmember)
{
Case Dispid_beforenaviGate2:
m_bdoccomplete = false;
M_spwebbrowser2 = pdispparams-> rgvarg [6] .pdispval; hr = m_spwebbrowser2-> get_document (& SPDISP);
En (ac))
{
CCOMQIPTR
SPHTML = SPDISP;
// if (SPHTML)
// RemoveDocument (SPHTML);
}
Break;
Case Dispid_naviGateComplete2:
//
/ * If (m_spwebbrowser2) {
_BSTR_T BSADDRESS = m_spwebbrowser2-> getlocationURL ();
LPCTSTR STR1, STR2;
Str1 = "solarsafe.htm";
Str2 = (lpctstr) BSADDRESS;
IF (str2, 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;
* /
// [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_spwebbrowser2-> quit ();
m_test = false;
}
// Fill in form if nesery
m_spwebbrowser2 = pdispparams-> rgvarg [1] .pdispval;
// Get the WebBrowser's Document Object
HR = m_spwebbrowser2-> get_document (& SPDISP);
En (ac))
{
CCOMQIPTR
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_downloadlineComplete:
Break;
* /
// [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;
* /
// [0]: Address of cancel flag - vt_byref | vt_bool
//
Case Dispid_onquit:
// unregister the keyboard hook previously installed. INSTALED HOOK PREVIOSTALLED
// for this installation.
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 caled.
// if (! Addinstance (m_hwndie, this, getcurrentthreadid ())))
// FormWhizError (IDS_ERROR_TOOMUCHWINDOWS, ErroRror);
// Connect To The Browser in Order to Handle Events.
if (! ManageConnection (Advise))
MessageBox (M_HWndie, "AAAA", "A", MB_OK);
// FormWhizError (IDS_ERROR_SINKINGFAILED, ErroRror);
}
}
Return S_OK;
}
Find .RGS file, join
HKLM
{
Software
{
Microsoft
{
Windows
{
CurrentVersion {
Explorer
{
'Browser Helper Objects'
{
Forceremove {B5D4581D-ED6A-4905-A267-25BAF7BE79C1} = S 'Safeie Utility'
}
}
}
}
}
}
}
The {B5D4581D-ED6A-4905-A267-25BAF7BE79C1} can be found in this file, pay attention, you do CSLID is definitely different.
Everything is OK, try it, you can first look at it, this project code