Un code qui met en place DIID_HTMLElementEvents2, pour recevoir des évents souris et clavier sur la page en cours.
Ce code est juste une démonstration, il n'est pas complet, il ne fonctionnera pas sur des pages web qui utilisent des Frames.
Avant d'exécuter ce code, remplacer Mon Login et Mon Mot de Passe dans la procédure OnMouseDown(..) par les votres, car ce code lance la connexion à ce Forum, cliquer sur les champs à remplir, et le texte sera écrit automatiquement.
Je crois qu'on peut faire beaucoup plus simple en faisant appel à la commande ElementFromPoint de l'interface IHtmlElement en subclassant la fenêtre Internet Explorer_Server.
Code : Tout sélectionner
; Les articles ci-dessous qui m'ont permis de rédiger ce code:
; MSDN:
; http://msdn2.microsoft.com/en-us/library/bb508508(VS.85).aspx
; CodeGuru:
; http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4391/
#DISPID_CLICK =-600 ;Cet event est reçu après l'event #DISPID_MOUSEUP
#DISPID_DBLCLICK =-601 ;Cet event est reçu après l'event #DISPID_MOUSEDOWN, #DISPID_MOUSEUP et #DISPID_CLICK
#DISPID_KEYDOWN =-602 ;on ne reçoit cet évènement que si on met en place une instance de IID_IOleInPlaceActiveObject
#DISPID_KEYPRESS =-603
#DISPID_KEYUP =-604 ;on ne reçoit cet event que si on met en place une instance de IID_IOleInPlaceActiveObject
#DISPID_MOUSEDOWN =-605
#DISPID_MOUSEMOVE =-606
#DISPID_MOUSEUP =-607
#DISPID_ERROREVENT =-608
#DISPID_READYSTATECHANGE =-609
; Il y a d'autres évènements, se reporter à la Doc MSDN
;//
;// Dispatch IDS For IExplorer Dispatch Events.
;//
#DISPID_BEFORENAVIGATE= 100 ;// this is sent before navigation To give a chance To abort
#DISPID_NAVIGATECOMPLETE= 101 ;// in async, this is sent when we have enough To show
#DISPID_STATUSTEXTCHANGE= 102
#DISPID_QUIT= 103
#DISPID_DOWNLOADCOMPLETE= 104
#DISPID_COMMANDSTATECHANGE= 105
#DISPID_DOWNLOADBEGIN= 106
#DISPID_NEWWINDOW= 107 ;// sent when a new window should be created
#DISPID_PROGRESSCHANGE= 108 ;// sent when download progress is updated
#DISPID_WINDOWMOVE= 109 ;// sent when main window has been moved
#DISPID_WINDOWRESIZE= 110 ;// sent when main window has been sized
#DISPID_WINDOWACTIVATE= 111 ;// sent when main window has been activated
#DISPID_PROPERTYCHANGE= 112 ;// sent when the PutProperty method is called
#DISPID_TITLECHANGE= 113 ;// sent when the document title changes
#DISPID_TITLEICONCHANGE= 114 ;// sent when the top level window icon may have changed.
#DISPID_FRAMEBEFORENAVIGATE= 200
#DISPID_FRAMENAVIGATECOMPLETE= 201
#DISPID_FRAMENEWWINDOW= 204
#DISPID_PRINTTEMPLATEINSTANTIATION= 225
#DISPID_PRINTTEMPLATETEARDOWN= 226
#DISPID_BEFORENAVIGATE2= 250 ;// hyperlink clicked on
#DISPID_NEWWINDOW2= 251
#DISPID_NAVIGATECOMPLETE2= 252 ;// UIActivate new document
#DISPID_ONQUIT= 253
#DISPID_ONVISIBLE= 254 ;// sent when the window goes visible/hidden
#DISPID_ONTOOLBAR= 255 ;// sent when the toolbar should be shown/hidden
#DISPID_ONMENUBAR= 256 ;// sent when the menubar should be shown/hidden
#DISPID_ONSTATUSBAR= 257 ;// sent when the statusbar should be shown/hidden
#DISPID_ONFULLSCREEN= 258 ;// sent when kiosk mode should be on/off
#DISPID_DOCUMENTCOMPLETE= 259 ;// new document goes ReadyState_Complete
#DISPID_ONTHEATERMODE= 260 ;// sent when theater mode should be on/off
#DISPID_ONADDRESSBAR= 261 ;// sent when the address bar should be shown/hidden
#DISPID_WINDOWSETRESIZABLE= 262 ;// sent To set the style of the host window frame
#DISPID_WINDOWCLOSING= 263 ;// sent before script window.close closes the window
#DISPID_WINDOWSETLEFT= 264 ;// sent when the put_left method is called on the WebOC
#DISPID_WINDOWSETTOP= 265 ;// sent when the put_top method is called on the WebOC
#DISPID_WINDOWSETWIDTH= 266 ;// sent when the put_width method is called on the WebOC
#DISPID_WINDOWSETHEIGHT= 267 ;// sent when the put_height method is called on the WebOC
#DISPID_CLIENTTOHOSTWINDOW= 268 ;// sent during window.open To request conversion of dimensions
#DISPID_SETSECURELOCKICON= 269 ;// sent To suggest the appropriate security icon To show
#DISPID_FILEDOWNLOAD= 270 ;// Fired To indicate the File Download dialog is opening
#DISPID_NAVIGATEERROR= 271 ;// Fired To indicate the a binding error has occured
#DISPID_PRIVACYIMPACTEDSTATECHANGE= 272 ;// Fired when the user's browsing experience is impacted
#DISPID_NEWWINDOW3= 273
Structure DispatchFunctions
QueryInterface.l
AddRef.l
Release.l
GetTypeInfoCount.l
GetTypeInfo.l
GetIDsOfNames.l
Invoke.l
EndStructure
Structure DispatchObject
*IDispatch.IDispatch
ObjectCount.l
Event.s
EndStructure
Structure VARIANT_SPLIT
StructureUnion
Variant.VARIANT
Split.l[4]
EndStructureUnion
EndStructure
Interface IHTMLElementCollection_FIXED
QueryInterface(a,b)
AddRef()
Release()
GetTypeInfoCount(a)
GetTypeInfo(a,b,c)
GetIDsOfNames(a,b,c,d,e)
Invoke(a,b,c,d,e,f,g,h)
toString(a)
put_length(a)
get_length(a)
get__newEnum(a)
item(a1,a2,a3,a4,b1,b2,b3,b4,c)
tags(a1,a2,a3,a4,b)
EndInterface
Global NewList dispatchObject.DispatchObject(),webBrowser.IWebBrowser2
Procedure ConnectEvents(*pElem.IHTMLElement)
Protected *pCPC.IConnectionPointContainer = #Null
Protected *pCP.IConnectionPoint = #Null
Protected dwCookie.l,*bstr.l,TagName.s
*bstr.l = SysAllocString_(Space((20*2)+2))
If *bstr
If *pElem\get_tagName(@*bstr)=#S_OK
If *bstr
TagName.s=PeekS(*bstr, 20,#PB_Unicode)
If TagName="HTML"
;// Check that this is a connectable object.
If *pElem\QueryInterface(?IID_IConnectionPointContainer, @*pCPC)=#S_OK
If *pCPC
;// Find the connection point.
If *pCPC\FindConnectionPoint(?DIID_HTMLElementEvents2, @*pCP)=#S_OK
If *pCP
;// Advise the connection point.
;// pUnk is the IUnknown Interface pointer For your event sink
AddElement(DispatchObject())
DispatchObject()\IDispatch = ?dispatchFunctions
DispatchObject()\Event="DIID_HTMLElementEvents2"
If *pCP\Advise(@DispatchObject(), @dwCookie)=#S_OK
;Debug ";// Successfully advised"
ret=1
Else
DeleteElement(DispatchObject())
EndIf
*pCP\Release()
EndIf
EndIf
*pCPC\Release()
EndIf
EndIf
EndIf
EndIf
EndIf
SysFreeString_(@*bstr)
EndIf
ProcedureReturn ret
EndProcedure
Procedure ProcessElementCollection(*pElemColl.IHTMLElementCollection_FIXED)
Protected *pElemDisp.IDispatch = #Null
Protected *pElem.IHTMLElement = #Null
Protected long.l=0,varIndex.VARIANT_SPLIT
varIndex.VARIANT_SPLIT\Variant\vt = #VT_I4
*pElemColl\get_length(@long.l)
For a=0 To long-1
varIndex\Variant\lVal = a
If *pElemColl\item(varIndex\split[0], varIndex\split[1], varIndex\split[2], varIndex\split[3], varIndex\split[0], varIndex\split[1], varIndex\split[2], varIndex\split[3], @*pElemDisp.IDispatch)=#S_OK
If *pElemDisp
If *pElemDisp\QueryInterface(?IID_IHTMLElement, @*pElem.IHTMLElement)=#S_OK
If *pElem
;// Obtained element With ID of "myID".
If ConnectEvents(*pElem)
Break
EndIf
*pElem\Release()
EndIf
EndIf
*pElemDisp\Release()
EndIf
EndIf
Next a
EndProcedure
Procedure ProcessDocument(*pDoc.IHTMLDocument2)
Protected *pElemColl.IHTMLElementCollection_Fixed = #Null
If *pDoc\get_all(@*pElemColl)=#S_OK
If *pElemColl
;// Obtained element collection.
ProcessElementCollection(*pElemColl)
*pElemColl\Release()
EndIf
EndIf
EndProcedure
Procedure BeforeNavigate2(*pDisp.Idispatch, *Url.Variant, *Flags.Variant, *TargetFrameName.Variant, *PostData.Variant, *Headers.Variant, *Cancel.long)
EndProcedure
Procedure DocumentComplete(*pDisp.IDispatch, *Url.VARIANT)
Debug "----------------------------------------------"
Debug "DocumentComplete"
Debug PeekL(*Url\bstrVal-4)
Debug PeekS(*Url\bstrVal,-1,#PB_Unicode)
Protected *pUnkBrowser.IUnknown = #Null
Protected *pUnkDisp.IUnknown = #Null
Protected *pDocDisp.IDispatch = #Null
Protected *pDoc.IHTMLDocument2 = #Null
;// Is this the DocumentComplete event For the top frame window?
;// Check COM identity: compare IUnknown Interface pointers.
If webBrowser\QueryInterface(?IID_IUnknown,@*pUnkBrowser)= #Null
If *pUnkBrowser
If *pDisp\QueryInterface(?IID_IUnknown, @*pUnkDisp)= #Null
If *pUnkDisp
If (*pUnkBrowser = *pUnkDisp)
;// This is the DocumentComplete event For the top frame.
;// This page is loaded, so we can access the DHTML Object Model.
If webBrowser\get_Document(@*pDocDisp)= #Null
If *pDocDisp
;// Obtained the document object.
If *pDocDisp\QueryInterface(?IID_IHTMLDocument2, @*pDoc)= #Null
If *pDoc
;// Obtained the IHTMLDocument2 Interface For the document object
ProcessDocument(*pDoc)
EndIf
EndIf
*pDocDisp\Release()
EndIf
EndIf
EndIf
*pUnkDisp\Release()
EndIf
EndIf
*pUnkBrowser\Release()
EndIf
EndIf
EndProcedure
Procedure NavigateComplete2(*pDisp.IDispatch, *Url.VARIANT)
EndProcedure
Procedure NavigateError(*pDisp.IDispatch, *Url.VARIANT, *TargetFrameName.VARIANT, *StatusCode.VARIANT, *Cancel.Long)
EndProcedure
Procedure NewWindow2(*ppDisp.Long, *Cancel.Long)
EndProcedure
Procedure ProgressChange(nProgress.l, nProgressMax.l)
If nProgressMax>0
Progress=nProgress*100/nProgressMax
SetGadgetState(2, Progress)
Else
SetGadgetState(2, 0)
EndIf
EndProcedure
Procedure StatusTextChange(*sText.l)
Protected Texte.s
Texte.s= PeekS(*sText,-1,#PB_Unicode)
StatusBarText(0, 0, Texte)
EndProcedure
Procedure TitleChange(*sText.l)
Protected Texte.s
Texte=PeekS(*sText,-1,#PB_Unicode)
element=GetGadgetState(0)
SetGadgetItemText(0, element, Texte, 0)
EndProcedure
Procedure.l AddRef(*THIS.DispatchObject)
*THIS\ObjectCount + 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure.l QueryInterface(*THIS.DispatchObject, *iid.GUID, *Object.Long)
If CompareMemory(*iid,?DIID_HTMLElementEvents2,16)Or CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID))
*Object\l = *THIS
*THIS2.IDispatch=*THIS.DispatchObject
*THIS2\AddRef()
ProcedureReturn #S_OK
EndIf
If CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
*Object\l = *THIS
*THIS2.IDispatch=*THIS.DispatchObject
*THIS2\AddRef()
ProcedureReturn #S_OK
EndIf
*Object\l = 0
ProcedureReturn #E_NOINTERFACE
EndProcedure
Procedure.l Release(*THIS.DispatchObject)
*THIS\ObjectCount - 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure GetTypeInfoCount(*THIS.DispatchObject, pctinfo)
ProcedureReturn #E_NOTIMPL
EndProcedure
Procedure GetTypeInfo(*THIS.DispatchObject, iTInfo, lcid, ppTInfo )
ProcedureReturn #E_NOTIMPL
EndProcedure
Procedure GetIDsOfNames(*THIS.DispatchObject, riid, rgszNames, cNames, lcid, rgDispId) : EndProcedure
Procedure OnMouseDown(*pElem.IHtmlElement)
Protected lFlags.l,*bstr.l,AttributeValue.VARIANT,Propriete.s
If *pElem
lFlags.l=1
If *pElem\getAttribute("name",lFlags,@AttributeValue)=#S_OK
If AttributeValue\vt=#VT_BSTR
If AttributeValue\bstrVal
Propriete=PeekS(AttributeValue\bstrVal,-1,#PB_Unicode)
SysFreeString_(@AttributeValue\bstrVal)
If Propriete="username"
*bstr.l = SysAllocString_(Space((200*2)+2))
If *bstr
PokeS(*bstr,"Mon Login",-1,#PB_Unicode)
AttributeValue\bstrVal=*bstr
*pElem\SetAttribute("value",@AttributeValue,lFlags)
SysFreeString_(@*bstr)
EndIf
ElseIf Propriete="password"
*bstr.l = SysAllocString_(Space((200*2)+2))
If *bstr
PokeS(*bstr,"Mon Mot de Passe",-1,#PB_Unicode)
AttributeValue\bstrVal=*bstr
*pElem\SetAttribute("value",@AttributeValue,lFlags)
SysFreeString_(@*bstr)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, *pDispParams.DISPPARAMS, *pVarResult.VARIANT, *pExcepInfo, *puArgErr)
Protected *params1.VARIANT,*params2.VARIANT,*params3.VARIANT
Protected *params4.VARIANT,*params5.VARIANT,*params6.VARIANT,*params7.VARIANT
Protected *pEvtObj.IHTMLEventObj=#Null
Protected *pElem.IHTMLElement=#Null
Protected *pDispElem.IDispatch=#Null
Protected Button.l,keyCode.l,ctrlKey.l,altKey.l
Select *THIS\Event
Case "DIID_HTMLElementEvents2"
; Debug "dispIdMember= "+Str(dispIdMember)
; Normalement, par rapport au code source de référence, je devrais travailler avec la variable *pVarResult
; pour récupérer un pointeur sur IDispatch mais ça ne marche pas, alors j'ai essayé
; avec *pDispParams\rgvarg et cela semble fonctionner
*params1.VARIANT=*pDispParams\rgvarg
*pDispElem.IDispatch = *params1\pdispVal
If *pDispElem
If *pDispElem\QueryInterface(?IID_IHTMLEventObj, @*pEvtObj)=#S_OK
If *pEvtObj
If *pEvtObj\Get_Button(@Button)=#S_OK
If *pEvtObj\get_keyCode(@keyCode)=#S_OK
If *pEvtObj\get_srcElement(@*pElem.IHTMLElement)=#S_OK
If *pElem
Select dispIdMember
Case #DISPID_KEYPRESS
If *pEvtObj\get_ctrlKey(@ctrlKey)=#S_OK
If ctrlKey
Debug "ctrlKey Pressed"
EndIf
EndIf
If *pEvtObj\get_altKey(@altKey)=#S_OK
If altKey
Debug "altKey Pressed"
EndIf
EndIf
Debug "keyCode= "+Chr(keyCode)
Case #DISPID_KEYDOWN
Debug "KEYDOWN"
Case #DISPID_KEYUP
Debug "KEYDUP"
Case #DISPID_MOUSEMOVE
Debug "MOUSEMOVE"
Case #DISPID_MOUSEDOWN
Select Button
Case 0 ;Default. No button is pressed.
Debug "DOWN> Left button is pressed"
;---------------------------------------------
Case 1 ;Left button is pressed.
Debug "DOWN> Left button is pressed"
OnMouseDown(*pElem)
;---------------------------------------------
Case 2 ;Right button is pressed.
Debug "DOWN> Right button is pressed"
Case 3 ;Left And right buttons are both pressed.
Debug "DOWN> Left And right buttons are both pressed"
Case 4 ;Middle button is pressed.
Debug "DOWN> Middle button is pressed"
Case 5 ;Left And middle buttons both are pressed.
Debug "DOWN> Left And middle buttons both are pressed"
Case 6 ;Right And middle buttons are both pressed.
Debug "DOWN> Right And middle buttons are both pressed"
Case 7 ;All three buttons are pressed.
Debug "DOWN> All three buttons are pressed"
EndSelect
Case #DISPID_MOUSEUP
Select Button
Case 0 ;Default. No button is pressed.
Debug "UP> Default. No button is pressed"
Case 1 ;Left button is pressed.
Debug "UP> Left button is pressed"
Case 2 ;Right button is pressed.
Debug "UP> Right button is pressed"
Case 3 ;Left And right buttons are both pressed.
Debug "UP> Left And right buttons are both pressed"
Case 4 ;Middle button is pressed.
Debug "UP> Middle button is pressed"
Case 5 ;Left And middle buttons both are pressed.
Debug "UP> Left And middle buttons both are pressed"
Case 6 ;Right And middle buttons are both pressed.
Debug "UP> Right And middle buttons are both pressed"
Case 7 ;All three buttons are pressed.
Debug "UP> All three buttons are pressed"
EndSelect
EndSelect
*pElem\Release()
EndIf
EndIf
EndIf
EndIf
*pEvtObj\Release()
EndIf
EndIf
EndIf
Case "IID_DWebBrowserEvents2"
Select dispIdMember
Case #DISPID_BEFORENAVIGATE2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*6)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*5)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*4)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*3)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*2)
*params6.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
*params7.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
BeforeNavigate2(*params1\pdispVal,*params2\pvarVal,*params3\pvarVal,*params4\pvarVal,*params5\pvarVal,*params6\pvarVal,*params2\pboolVal)
Case #DISPID_DOCUMENTCOMPLETE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
DocumentComplete(*params1\pdispVal, *params2\pvarVal)
Case #DISPID_NAVIGATEERROR
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*4)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*3)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*2)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
NavigateError(*params1\pdispVal, *params2\pvarVal, *params3\pvarVal, *params4\pvarVal, *params5\pboolVal)
Case #DISPID_NEWWINDOW2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
NewWindow2(*params1\ppdispVal, *params2\pboolVal)
Case #DISPID_PROGRESSCHANGE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(DISPPARAMS)*0)
ProgressChange(*params1\lVal, *params2\lVal)
Case #DISPID_STATUSTEXTCHANGE
*params.VARIANT = *pDispParams\rgvarg
StatusTextChange(*params\bstrVal)
Case #DISPID_TITLECHANGE
*params.VARIANT = *pDispParams\rgvarg
TitleChange(*params\bstrVal)
EndSelect
EndSelect
EndProcedure
AddElement(dispatchObject())
dispatchObject()\IDispatch = ?dispatchFunctions
dispatchObject()\Event="IID_DWebBrowserEvents2"
OpenWindow(0,0,0,640,520,"Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateStatusBar(0, WindowID(0))
AddStatusBarField(300)
AddStatusBarField(300)
EndIf
StatusBarText(0, 0, "")
StatusBarText(0, 1, "")
CreateGadgetList(WindowID(0))
PanelGadget(0, 10, 50, 620, 420)
AddGadgetItem (0, -1, "")
WebGadget(1,10,10,600,380, "http://www.purebasic.fr/french/login.php?")
CloseGadgetList()
ProgressBarGadget(2, 10, 10, 200, 20, 0, 100)
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(1), #GWL_USERDATA)
If webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)=#S_OK
If connectionPointContainer
If connectionPointContainer\FindConnectionPoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)=#S_OK
If connectionPoint
If connectionPoint\Advise(@dispatchObject(), @Cookie)=#S_OK
Connexion=1
EndIf
connectionPoint\Release()
EndIf
EndIf
connectionPointContainer\Release()
EndIf
EndIf
If Connexion=0
MessageRequester("Info","La connexion à échouée")
EndIf
Repeat
Event= WaitWindowEvent()
Select Event
Case #WM_KEYDOWN,#WM_KEYUP ; a mettre en place si on veut recevoir ces events dans le traitement HTMLElementEvents2
; ce n'est pas nécessaire si l'event #DISPID_KEYPRESS vous suffit
webBrowser\QueryInterface(?IID_IOleInPlaceActiveObject, @OleObject.IOleInPlaceActiveObject)
web.MSG\message = Event:web\wParam = EventwParam():web\lParam = EventlParam()
OleObject\TranslateAccelerator(@web)
OleObject\Release()
Case #WM_CLOSE
quit.l=1
EndSelect
Until quit.l=1
End
DataSection
IID_IOleInPlaceActiveObject:
Data.l $00000117
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
CLSID_IOleInPlaceActiveObject:
Data.l $00000320
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
dispatchFunctions:
Data.l @QueryInterface(),@AddRef(),@Release(),@GetTypeInfoCount()
Data.l @GetTypeInfo(),@GetIDsOfNames(),@Invoke()
IID_IOleCommandTarget:
Data.l $B722BCCB
Data.w $4E68, $101B
Data.b $A2, $BC, $00, $AA, $00, $40, $47, $70
CGID_IWebBrowser:
Data.l $ED016940
Data.w $BD5B, $11CF
Data.b $BA, $4E, $00, $C0, $4F, $D7, $08, $16
IID_IWebBrowser2:
Data.l $D30C1661
Data.w $CDAF, $11D0
Data.b $8A, $3E, $00, $C0, $4F, $C9, $E2, $6E
IID_IConnectionPointContainer:
Data.l $B196B284
Data.w $BAB4, $101A
Data.b $B6, $9C, $00, $AA, $00, $34, $1D, $07
IID_IDispatch:
Data.l $00020400
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
IID_IUnknown:
Data.l $00000000
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
IID_DWebBrowserEvents2:
Data.l $34A715A0
Data.w $6587, $11D0
Data.b $92, $4A, $00, $20, $AF, $C7, $AC, $4D
IID_IHTMLElement:
Data.l $3050F1FF
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
IID_IHTMLDocument2:
Data.l $332C4425
Data.w $26CB, $11D0
Data.b $B4, $83, $00, $C0, $4F, $D9, $01, $19
DIID_HTMLElementEvents2:
Data.l $3050F60F
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
IID_IHTMLEventObj:
Data.l $3050F32D
Data.w $98B5, $11CF
Data.b $BB, $82, $00, $AA, $00, $BD, $CE, $0B
EndDataSection