
WebGadget DocumentComplete event
I'm getting closer! as you can see I am able to receive an event from the WebGadget (!!), but after that it crashes... why?!?
References
viewtopic.php?t=8538&highlight=interface+objects
viewtopic.php?t=12133
(Sparkie, no variant seemed to be necessary..!?)
Code: Select all
;- Implementation af the IDispatch interface --------------------------------------------------
Structure DispatchFunctions
QueryInterface.l
AddRef.l
Release.l
GetTypeInfoCount.l
GetTypeInfo.l
GetIDsOfNames.l
Invoke.l
EndStructure
Structure DispatchObject
*dispatchFunctions.DispatchFunctions
ObjectCount.l
EndStructure
Procedure.l AddRef(*THIS.DispatchObject)
*THIS\ObjectCount + 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure.l QueryInterface(*THIS.DispatchObject, *iid.GUID, *Object.LONG)
If CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID)) Or CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
*Object\l = *THIS
AddRef(*THIS.DispatchObject)
ProcedureReturn #S_OK
Else : *Object\l = 0 : ProcedureReturn #E_NOINTERFACE : EndIf
EndProcedure
Procedure.l Release(*THIS.DispatchObject)
*THIS\ObjectCount - 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure GetTypeInfoCount(pctinfo) : EndProcedure
Procedure GetTypeInfo(iTInfo, lcid, ppTInfo ) : EndProcedure
Procedure GetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId) : EndProcedure
Procedure Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr)
Debug "got an event!!! (I think)"
EndProcedure
dispatchFunctions.DispatchFunctions\QueryInterface = @QueryInterface()
dispatchFunctions.DispatchFunctions\AddRef = @AddRef()
dispatchFunctions.DispatchFunctions\Release = @Release()
dispatchFunctions.DispatchFunctions\GetTypeInfoCount = @GetTypeInfoCount()
dispatchFunctions.DispatchFunctions\GetTypeInfo = @GetTypeInfo()
dispatchFunctions.DispatchFunctions\GetIDsOfNames = @GetIDsOfNames()
dispatchFunctions.DispatchFunctions\Invoke = @Invoke()
dispatchObject.DispatchObject\dispatchFunctions = dispatchFunctions
;Declare an instance
dispatch.IDispatch = @dispatchObject
;---------------------------------------------------------------------------------------------
OpenWindow(0,0,0,300,300,#PB_Window_ScreenCentered,"Test")
CreateGadgetList(WindowID(0))
WebGadget(0,0,0,300,300, "purebasic.com")
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)
webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
connectionPointContainer\FindConnectionPoint(?IID_IDispatch, @connectionPoint.IConnectionPoint)
;Tell the webBrowser of the connectionpoint, that it should call my implementation of
;the Idispatch object when firing events
connectionPoint\Advise(dispatch, @Cookie)
End
DataSection
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
EndDataSection
viewtopic.php?t=8538&highlight=interface+objects
viewtopic.php?t=12133
(Sparkie, no variant seemed to be necessary..!?)
-
- User
- Posts: 39
- Joined: Fri Mar 26, 2004 1:47 pm
- Location: London, UK
- Contact:
i found the problem! I just forgot to give Invoke the first parameter *THIS.DispatchObject. You'll never believe how much time I spent browsing documentation until I noticed this...
Code: Select all
#DISPID_DOWNLOADCOMPLETE = 104
;- Implementation af the IDispatch interface --------------------------------------------------
Structure DispatchFunctions
QueryInterface.l
AddRef.l
Release.l
GetTypeInfoCount.l
GetTypeInfo.l
GetIDsOfNames.l
Invoke.l
EndStructure
Structure DispatchObject
*dispatchFunctions.DispatchFunctions
ObjectCount.l
EndStructure
Procedure.l AddRef(*THIS.DispatchObject)
*THIS\ObjectCount + 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure.l QueryInterface(*THIS.DispatchObject, *iid.GUID, *Object.LONG)
If CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID)) Or CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
*Object\l = *THIS
AddRef(*THIS.DispatchObject)
ProcedureReturn #S_OK
Else : *Object\l = 0 : ProcedureReturn #E_NOINTERFACE : EndIf
EndProcedure
Procedure.l Release(*THIS.DispatchObject)
*THIS\ObjectCount - 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure GetTypeInfoCount(*THIS.DispatchObject, pctinfo) : EndProcedure
Procedure GetTypeInfo(*THIS.DispatchObject, iTInfo, lcid, ppTInfo ) : EndProcedure
Procedure GetIDsOfNames(*THIS.DispatchObject, riid, rgszNames, cNames, lcid, rgDispId) : EndProcedure
Procedure Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr)
If dispIDMember = #DISPID_DOWNLOADCOMPLETE
Debug "YES!"
EndIf
EndProcedure
dispatchFunctions.DispatchFunctions\QueryInterface = @QueryInterface()
dispatchFunctions.DispatchFunctions\AddRef = @AddRef()
dispatchFunctions.DispatchFunctions\Release = @Release()
dispatchFunctions.DispatchFunctions\GetTypeInfoCount = @GetTypeInfoCount()
dispatchFunctions.DispatchFunctions\GetTypeInfo = @GetTypeInfo()
dispatchFunctions.DispatchFunctions\GetIDsOfNames = @GetIDsOfNames()
dispatchFunctions.DispatchFunctions\Invoke = @Invoke()
dispatchObject.DispatchObject\dispatchFunctions = dispatchFunctions
;Declare an instance
dispatch.IDispatch = @dispatchObject
;---------------------------------------------------------------------------------------------
OpenWindow(0,0,0,300,300,#PB_Window_ScreenCentered,"Test")
CreateGadgetList(WindowID(0))
WebGadget(0,0,0,300,300, "purebasic.com")
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)
webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
connectionPointContainer\FindConnectionPoint(?IID_IDispatch, @connectionPoint.IConnectionPoint)
;Tell the webBrowser of the connectionpoint, that it should call my implementation of
;the Idispatch object when firing events
connectionPoint\Advise(dispatch, @Cookie)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
End
DataSection
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
EndDataSection
Very good job soerenkj!soerenkj wrote:no problem. btw I just found out about the 'COMEvents' user library which will handle this problem also (it's on purearea.net). too bad I did not notice that earlier..
I was messing with these things too before noticing that lib. That made the job really easy for me.
Unfortunately it doesn't work on PB4, it gives the usual error as other pre-PB4 libs gives.
I thought about reviving this project then, by adding the features of that lib to it (atleast the most useful).
I did a private project using the COMEvents lib, and in the process of converting it to PB4 I found out that problem. So I started looking back at this forum, trying to figure out if I can use some of the sources posted to get rid of the lib and use only PB code to do the job.
I found out that the most clean and readable is your code, and so I started working a bit with it.
I must say that I'm ill now so I can't concentrate at 100% to it, but I got stuck in a point.
I slightly modified it to support the DWebBrowserEvents2 events, which includes a good set of useful events to use for your programs. The fact is that some events aren't simply useful because you can know they fired, but some needs also to set up some data to modify some behavior of the WebGadget.
As an example I show you the NewWindow3 event, which I'm working on, that also have a Cancel variable that you can set to a bool value to either allow a new window to be opened or not (like when clicking on a link and it opens in a new window, or via the menu), and 2 more variables that contains the source URL and the destination URL: link to MSDN page for NewWindow3 event.
I got stuck in the part where you wrote <Debug "YES!"> when your event fired up. I can know when the NewWindow3 event fires, and I also find out that the pDispParams parameter of your Invoke() procedure contains the parameters of the NewWindow3 event (see modified source below), but I don't know neither how to retrieve them from the VARIANT structure nor how to modify them in order to make the event react on the changes.
I did slight modifications to make it work under PB4 and to make it react on DWebBrowserEvents2 events. You can see that the *pDispParams\cArgs structure field contains the number of arguments passed by the fired event, but there's still some work to obtain them and to set them. If the code will work, I will be happy to modify it so it can handle multiple objects (more WebGadgets at once) like the COMEvents lib does, and to add a similar command as the cevBindEvent, to make it easier to add event handling.
Code: Select all
;- Implementation af the IDispatch interface --------------------------------------------------
#DISPID_DOWNLOADCOMPLETE = 104
#DISPID_NEWWINDOW3 = 273
#DISPID_DOCUMENTCOMPLETE = $00000103
#DISPID_FILEDOWNLOAD = $0000010e
#DISPID_PROGRESSCHANGE = $0000006c
#DISPID_BEFORENAVIGATE2 = $000000fa
#DISPID_NEWWINDOW2 = 251
Structure DispatchFunctions
QueryInterface.l
AddRef.l
Release.l
GetTypeInfoCount.l
GetTypeInfo.l
GetIDsOfNames.l
Invoke.l
EndStructure
Structure DispatchObject
*dispatchFunctions.DispatchFunctions
ObjectCount.l
EndStructure
Procedure.l AddRef(*THIS.DispatchObject)
*THIS\ObjectCount + 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure.l QueryInterface(*THIS.DispatchObject, *iid.GUID, *Object.LONG)
If CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID)) Or CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
*Object\l = *THIS
AddRef(*THIS.DispatchObject)
ProcedureReturn #S_OK
Else : *Object\l = 0 : ProcedureReturn #E_NOINTERFACE : EndIf
EndProcedure
Procedure.l Release(*THIS.DispatchObject)
*THIS\ObjectCount - 1
ProcedureReturn *THIS\ObjectCount
EndProcedure
Procedure GetTypeInfoCount(*THIS.DispatchObject, pctinfo) : EndProcedure
Procedure GetTypeInfo(*THIS.DispatchObject, iTInfo, lcid, ppTInfo ) : EndProcedure
Procedure GetIDsOfNames(*THIS.DispatchObject, riid, rgszNames, cNames, lcid, rgDispId) : EndProcedure
Procedure Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, *pDispParams.DISPPARAMS, pVarResult, pExcepInfo, puArgErr)
If dispIDMember = #DISPID_DOWNLOADCOMPLETE
Debug "YES!"
ElseIf dispIDMember = #DISPID_NEWWINDOW3
Debug "NewWindow3"
Debug "numargs: "+Str(*pDispParams\cArgs)
*params.VARIANT = *pDispParams\rgvarg
;now I need to be able to access the parameters (which are in the VARIANT structure) and set them to block the NewWindow
ElseIf dispIDMember = #DISPID_DOCUMENTCOMPLETE
Debug "Doc Complete"
EndIf
EndProcedure
dispatchFunctions.DispatchFunctions\QueryInterface = @QueryInterface()
dispatchFunctions.DispatchFunctions\AddRef = @AddRef()
dispatchFunctions.DispatchFunctions\Release = @Release()
dispatchFunctions.DispatchFunctions\GetTypeInfoCount = @GetTypeInfoCount()
dispatchFunctions.DispatchFunctions\GetTypeInfo = @GetTypeInfo()
dispatchFunctions.DispatchFunctions\GetIDsOfNames = @GetIDsOfNames()
dispatchFunctions.DispatchFunctions\Invoke = @Invoke()
dispatchObject.DispatchObject\dispatchFunctions = dispatchFunctions
;Declare an instance
dispatch.IDispatch = @dispatchObject
;---------------------------------------------------------------------------------------------
OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
WebGadget(0,0,0,640,480, "purebasic.com")
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)
webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
;connectionPointContainer\FindConnectionPoint(?IID_IDispatch, @connectionPoint.IConnectionPoint)
connectionPointContainer\FindConnectionPoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)
;Tell the webBrowser of the connectionpoint, that it should call my implementation of
;the Idispatch object when firing events
connectionPoint\Advise(dispatch, @Cookie)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
End
DataSection
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
EndDataSection
Code: Select all
;- Implementation af the IDispatch interface
; Original code posted by soerenkj
; Completed by Nico
;//
;// 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
EndStructure
Global NewList dispatchObject.DispatchObject()
Procedure BeforeNavigate2(*pDisp.Idispatch, *Url.Variant, *Flags.Variant, *TargetFrameName.Variant, *PostData.Variant, *Headers.Variant, *Cancel.long)
Debug "----------------------------------------------"
Debug "BeforeNavigate2"
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndProcedure
Procedure ClientToHostWindow(*CX.LONG, *CY.LONG)
Debug "----------------------------------------------"
Debug "ClientToHostWindow"
Debug *CX\l
Debug *CY\l
EndProcedure
Procedure CommandStateChange(Command.l, Enable.l)
Debug "----------------------------------------------"
;Valeur pour la Variable Command
; #CSC_UPDATECOMMANDS = $FFFFFFFF
; #CSC_NAVIGATEFORWARD = $00000001
; #CSC_NAVIGATEBACK = $00000002
Debug "CommandStateChange"
Debug Command
Debug Enable
EndProcedure
Procedure DocumentComplete(*pDisp.IDispatch, *URL.Variant)
Debug "----------------------------------------------"
Debug "DocumentComplete"
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndProcedure
Procedure DownloadComplete()
Debug "----------------------------------------------"
Debug "DownloadComplete"
EndProcedure
Procedure DownloadBegin()
Debug "----------------------------------------------"
Debug "DownloadBegin"
EndProcedure
Procedure FileDownload(*bActiveDocument.LONG, *bCancel.LONG)
Debug "----------------------------------------------"
Debug "FileDownload"
Debug *bActiveDocument\l
Debug *bCancel\l
EndProcedure
Procedure NavigateComplete2(*pDisp.IDispatch, *URL.Variant)
Debug "----------------------------------------------"
Debug "NavigateComplete2"
If *Url\vt = 8 ;#VT_BSTR
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndIf
EndProcedure
Procedure NavigateError(*pDisp.IDispatch, *URL.Variant, *TargetFrameName.Variant, *StatusCode.Variant, *Cancel.LONG)
Debug "----------------------------------------------"
Debug "NavigateError"
If *Url\vt = 8 ;#VT_BSTR
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndIf
EndProcedure
Procedure NewWindow2(*ppDisp.LONG, *Cancel.LONG)
Debug "----------------------------------------------"
Debug "NewWindow2"
Debug *Cancel\l
EndProcedure
Procedure OnFullScreen(FullScreen.l)
Debug "----------------------------------------------"
Debug "OnFullScreen"
Debug FullScreen
EndProcedure
Procedure OnMenuBar(MenuBar.l)
Debug "----------------------------------------------"
Debug "OnMenuBar"
Debug "MenuBar"
EndProcedure
Procedure OnQuit()
Debug "----------------------------------------------"
Debug "OnQuit"
EndProcedure
Procedure OnStatusBar(StatusBar.l)
Debug "----------------------------------------------"
Debug "OnStatusBar"
Debug "StatusBar"
EndProcedure
Procedure OnTheaterMode(TheaterMode.l)
Debug "----------------------------------------------"
Debug "OnTheaterMode"
EndProcedure
Procedure OnToolBar(ToolBar.l)
Debug "----------------------------------------------"
Debug "OnToolBar"
Debug "ToolBar"
EndProcedure
Procedure OnVisible(vVisible.l)
Debug "----------------------------------------------"
Debug "OnVisible"
Debug "vVisible"
EndProcedure
Procedure PrintTemplateInstantiation(*pDisp.IDispatch)
Debug "----------------------------------------------"
;PrintTemplateInstantiation was introduced in Microsoft Internet Explorer 6
Debug "PrintTemplateInstantiation"
EndProcedure
Procedure PrintTemplateTeardown(*pDisp.IDispatch)
Debug "----------------------------------------------"
;PrintTemplateTeardown was introduced in Microsoft Internet Explorer 6
Debug "PrintTemplateTeardown"
EndProcedure
Procedure PrivacyImpactedStateChange(bPrivacyImpacted.l)
Debug "----------------------------------------------"
Debug "bPrivacyImpacted"
Debug bPrivacyImpacted
EndProcedure
Procedure ProgressChange(nProgress.l, nProgressMax.l)
Debug "----------------------------------------------"
Debug "ProgressChange"
Debug nProgress
Debug nProgressMax
EndProcedure
Procedure PropertyChange(*sProperty.l)
Debug "----------------------------------------------"
Debug "PropertyChange"
Debug PeekL(*sProperty-4)
Debug PeekS(*sProperty,-1,#PB_Unicode)
EndProcedure
Procedure SetSecureLockIcon(SecureLockIcon.l)
Debug "----------------------------------------------"
; SecureLockIcon Constants
; secureLockIconUnsecure = 0
; secureLockIconMixed = 1
; secureLockIconSecureUnknownBits = 2
; secureLockIconSecure40Bit = 3
; secureLockIconSecure56Bit = 4
; secureLockIconSecureFortezza = 5
; secureLockIconSecure128Bit = 6
Debug "SetSecureLockIcon"
Debug SecureLockIcon
EndProcedure
Procedure StatusTextChange(*sText.l)
Debug "----------------------------------------------"
Debug "StatusTextChange"
Debug PeekL(*sText-4)
Debug PeekS(*sText,-1,#PB_Unicode)
EndProcedure
Procedure TitleChange(*sText.l)
Debug "----------------------------------------------"
Debug "TitleChange"
Debug PeekL(*sText-4)
Debug PeekS(*sText,-1,#PB_Unicode)
EndProcedure
Procedure WindowClosing(bIsChildWindow.l, *Cancel.LONG)
Debug "----------------------------------------------"
Debug "WindowClosing"
Debug bIsChildWindow
EndProcedure
Procedure WindowSetLeft(nLeft.l)
Debug "----------------------------------------------"
Debug "WindoSetLeft"
EndProcedure
Procedure WindowSetTop(nTop.l)
Debug "----------------------------------------------"
Debug "WindoSetTop"
EndProcedure
Procedure WindowSetWidth(nWidth.l)
Debug "----------------------------------------------"
Debug "WindoSetTop"
EndProcedure
Procedure WindowSetHeight(nHeight.l)
Debug "----------------------------------------------"
Debug "WindoSetHeight"
EndProcedure
Procedure WindowSetResizable(bResizable.l)
Debug "----------------------------------------------"
Debug "WindowSetResizable"
Debug bResizable
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,?IID_DWebBrowserEvents2,16)
CallDebugger
EndIf
If CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID)) Or CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
*Object\l = *THIS
AddRef(*THIS.DispatchObject)
ProcedureReturn #S_OK
Else
*Object\l = 0
ProcedureReturn #E_NOINTERFACE
EndIf
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 Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, *pDispParams.DISPPARAMS, pVarResult, pExcepInfo, puArgErr)
Select dispIDMember
Case #DISPID_BEFORENAVIGATE2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*6)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*5)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*4)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*3)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*2)
*params6.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params7.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
BeforeNavigate2(*params1\pdispVal,*params2\pvarVal,*params3\pvarVal,*params4\pvarVal,*params5\pvarVal,*params6\pvarVal,*params2\pboolVal)
Case #DISPID_CLIENTTOHOSTWINDOW
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
ClientToHostWindow(*params1\plVal, *params2\plVal)
Case #DISPID_COMMANDSTATECHANGE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
CommandStateChange(*params1\lVal, *params2\boolVal)
Case #DISPID_DOCUMENTCOMPLETE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
DocumentComplete(*params1\pDispVal, *params2\pvarVal)
Case #DISPID_DOWNLOADBEGIN
DownloadBegin()
Case #DISPID_DOWNLOADCOMPLETE
DownloadComplete()
Case #DISPID_FILEDOWNLOAD
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
FileDownload(*params1\pBoolVal, *params2\pBoolVal)
Case #DISPID_NAVIGATECOMPLETE2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NavigateComplete2(*params1\pDispVal, *params2\pvarVal)
Case #DISPID_NAVIGATEERROR
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*4)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*3)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*2)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NavigateError(*params1\pdispVal, *params2\pvarVal, *params3\pvarVal, *params4\pvarVal, *params5\pboolVal)
Case #DISPID_NEWWINDOW2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NewWindow2(*params1\ppdispVal, *params2\pboolVal)
Case #DISPID_ONFULLSCREEN
*params.VARIANT = *pDispParams\rgvarg
OnFullScreen(*params\boolVal)
Case #DISPID_ONMENUBAR
*params.VARIANT = *pDispParams\rgvarg
OnMenuBar(*params\boolVal)
Case #DISPID_ONQUIT
OnQuit()
Case #DISPID_ONSTATUSBAR
*params.VARIANT = *pDispParams\rgvarg
OnStatusBar(*params\boolVal)
Case #DISPID_ONTHEATERMODE
*params1.VARIANT = *pDispParams\rgvarg
OnTheaterMode(*params1\boolVal)
Case #DISPID_ONTOOLBAR
*params.VARIANT = *pDispParams\rgvarg
OnToolbar(*params\boolVal)
Case #DISPID_ONVISIBLE
*params.VARIANT = *pDispParams\rgvarg
OnVisible(*params\boolVal)
Case #DISPID_PRINTTEMPLATEINSTANTIATION
*params.VARIANT = *pDispParams\rgvarg
PrintTemplateInstantiation(*params\pdispVal)
Case #DISPID_PRINTTEMPLATETEARDOWN
*params.VARIANT = *pDispParams\rgvarg
PrintTemplateTeardown(*params\pdispVal)
Case #DISPID_PRIVACYIMPACTEDSTATECHANGE
*params.VARIANT = *pDispParams\rgvarg
PrivacyImpactedStateChange(*params\boolVal)
Case #DISPID_PROGRESSCHANGE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
ProgressChange(*params1\lVal, *params2\lVal)
Case #DISPID_PROPERTYCHANGE
*params.VARIANT = *pDispParams\rgvarg
PropertyChange(*params\bstrVal)
Case #DISPID_SETSECURELOCKICON
*params.VARIANT = *pDispParams\rgvarg
SetSecureLockIcon(*params\lVal)
Case #DISPID_STATUSTEXTCHANGE
*params.VARIANT = *pDispParams\rgvarg
StatusTextChange(*params\bstrval)
Case #DISPID_TITLECHANGE
*params.VARIANT = *pDispParams\rgvarg
TitleChange(*params\bstrVal)
Case #DISPID_WINDOWCLOSING
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
WindowClosing(*params1\boolVal, *params2\pboolVal)
Case #DISPID_WINDOWSETLEFT
*params.VARIANT = *pDispParams\rgvarg
WindowSetLeft(*params\lVal)
Case #DISPID_WINDOWSETTOP
*params.VARIANT = *pDispParams\rgvarg
WindowSetTop(*params\lVal)
Case #DISPID_WINDOWSETWIDTH
*params.VARIANT = *pDispParams\rgvarg
WindowSetWidth(*params\lVal)
Case #DISPID_WINDOWSETHEIGHT
*params.VARIANT = *pDispParams\rgvarg
WindowSetHeight(*params\lVal)
Case #DISPID_WINDOWSETRESIZABLE
*params.VARIANT = *pDispParams\rgvarg
WindowSetResizable(*params\boolVal)
EndSelect
EndProcedure
;
; ;Declare an instance
; dispatch.IDispatch = @dispatchObject
AddElement(DispatchObject())
DispatchObject()\IDispatch = ?dispatchFunctions
;---------------------------------------------------------------------------------------------
OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
WebGadget(0,0,0,640,480, "http://www.purebasic.com/")
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)
webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
connectionPointContainer\findconnectionpoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)
connectionPoint\Advise(DispatchObject(), @Cookie)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
connectionPoint\UnAdvise(Cookie)
connectionPoint\release()
connectionPointContainer\release()
End
DataSection
dispatchFunctions:
Data.l @QueryInterface(),@AddRef(),@Release(),@GetTypeInfoCount()
Data.l @GetTypeInfo(),@GetIDsOfNames(),@Invoke()
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
EndDataSection
Use of the event NewWindow2; in the example, I destroy the current Webgadget and I recreate a new which takes its place. (I would have been able to the created in a new tab).
With the event NewWindow2, we are obliged to create a new Webgadget or to use another WebGadget so that the URL is otherwise redirected that does not work.
With the event NewWindow2, we are obliged to create a new Webgadget or to use another WebGadget so that the URL is otherwise redirected that does not work.
Code: Select all
;- Implementation af the IDispatch interface
; Original code posted by soerenkj
; Completed by Nico
;//
;// 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
GadgetID.l
EndStructure
Global NewList dispatchObject.DispatchObject()
Procedure BeforeNavigate2(*THIS.DispatchObject,*pDisp.Idispatch, *Url.Variant, *Flags.Variant, *TargetFrameName.Variant, *PostData.Variant, *Headers.Variant, *Cancel.long)
Debug "----------------------------------------------"
Debug "BeforeNavigate2"
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndProcedure
Procedure ClientToHostWindow(*THIS.DispatchObject,*CX.LONG, *CY.LONG)
Debug "----------------------------------------------"
Debug "ClientToHostWindow"
Debug *CX\l
Debug *CY\l
EndProcedure
Procedure CommandStateChange(*THIS.DispatchObject,Command.l, Enable.l)
Debug "----------------------------------------------"
;Valeur pour la Variable Command
; #CSC_UPDATECOMMANDS = $FFFFFFFF
; #CSC_NAVIGATEFORWARD = $00000001
; #CSC_NAVIGATEBACK = $00000002
Debug "CommandStateChange"
Debug Command
Debug Enable
EndProcedure
Procedure DocumentComplete(*THIS.DispatchObject,*pDisp.IDispatch, *URL.Variant)
Debug "----------------------------------------------"
Debug "DocumentComplete"
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndProcedure
Procedure DownloadComplete(*THIS.DispatchObject)
Debug "----------------------------------------------"
Debug "DownloadComplete"
EndProcedure
Procedure DownloadBegin(*THIS.DispatchObject)
Debug "----------------------------------------------"
Debug "DownloadBegin"
EndProcedure
Procedure FileDownload(*THIS.DispatchObject,bActiveDocument.l, *bCancel.LONG)
Debug "----------------------------------------------"
Debug "FileDownload"
Debug bActiveDocument
Debug *bCancel\l
EndProcedure
Procedure NavigateComplete2(*THIS.DispatchObject,*pDisp.IDispatch, *URL.Variant)
Debug "----------------------------------------------"
Debug "NavigateComplete2"
If *Url\vt = 8 ;#VT_BSTR
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndIf
EndProcedure
Procedure NavigateError(*THIS.DispatchObject,*pDisp.IDispatch, *URL.Variant, *TargetFrameName.Variant, *StatusCode.Variant, *Cancel.LONG)
Debug "----------------------------------------------"
Debug "NavigateError"
If *Url\vt = 8 ;#VT_BSTR
Debug PeekL(*Url\bstrval-4)
Debug PeekS(*Url\bstrval,-1,#PB_Unicode)
EndIf
EndProcedure
Procedure NewWindow2(*THIS.DispatchObject,*ppDisp.LONG, *Cancel.LONG)
Protected X.l,Y.l,Width.l,Height.l,ID.l,Disp.l
Debug "----------------------------------------------"
Debug "NewWindow2"
; On récupère les coordonnées du WebGadget actuel
X=GadgetX(*THIS\GadgetID)
Y=GadgetY(*THIS\GadgetID)
Width=GadgetWidth(*THIS\GadgetID)
Height=GadgetHeight(*THIS\GadgetID)
; On cache le WebGadget actuel
HideGadget(*THIS\GadgetID,1)
; On crée un nouveau WebGadget avec les coordonnées récupérées
OpenGadgetList(0,0)
ID=WebGadget(#PB_Any,X,Y,Width,Height,"About:Blank")
CloseGadgetList()
; On récupère l'interface IWebBrowser2 du nouveau WebGadget
WebBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(ID), #GWL_USERDATA)
; On récupère l'interface Idispatch
Webbrowser\Get_Application(@Disp)
; On affecte l'interface Idispactch du WebGadget créé au paramètre *ppDisp
*ppDisp\l=Disp
; On détruit l'élément courant
DeleteElement(DispatchObject())
; On détruit l'ancien WebGadget
FreeGadget(*THIS\GadgetID)
; On ajoute à la liste le nouveau WebGadget créé
AddElement(DispatchObject())
DispatchObject()\IDispatch = ?dispatchFunctions
DispatchObject()\GadgetID=ID
; On crée un point de connexion sur l'interface IDispatch
WebBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
connectionPointContainer\findconnectionpoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)
connectionPoint\Advise(DispatchObject(), @Cookie)
connectionPoint\release()
connectionPointContainer\release()
EndProcedure
Procedure OnFullScreen(*THIS.DispatchObject,FullScreen.l)
Debug "----------------------------------------------"
Debug "OnFullScreen"
Debug FullScreen
EndProcedure
Procedure OnMenuBar(*THIS.DispatchObject,MenuBar.l)
Debug "----------------------------------------------"
Debug "OnMenuBar"
Debug "MenuBar"
EndProcedure
Procedure OnQuit(*THIS)
Debug "----------------------------------------------"
Debug "OnQuit"
EndProcedure
Procedure OnStatusBar(*THIS.DispatchObject,StatusBar.l)
Debug "----------------------------------------------"
Debug "OnStatusBar"
Debug "StatusBar"
EndProcedure
Procedure OnTheaterMode(*THIS.DispatchObject,TheaterMode.l)
Debug "----------------------------------------------"
Debug "OnTheaterMode"
EndProcedure
Procedure OnToolBar(*THIS.DispatchObject,ToolBar.l)
Debug "----------------------------------------------"
Debug "OnToolBar"
Debug "ToolBar"
EndProcedure
Procedure OnVisible(*THIS.DispatchObject,vVisible.l)
Debug "----------------------------------------------"
Debug "OnVisible"
Debug "vVisible"
EndProcedure
Procedure PrintTemplateInstantiation(*THIS.DispatchObject,*pDisp.IDispatch)
Debug "----------------------------------------------"
;PrintTemplateInstantiation was introduced in Microsoft Internet Explorer 6
Debug "PrintTemplateInstantiation"
EndProcedure
Procedure PrintTemplateTeardown(*THIS.DispatchObject,*pDisp.IDispatch)
Debug "----------------------------------------------"
;PrintTemplateTeardown was introduced in Microsoft Internet Explorer 6
Debug "PrintTemplateTeardown"
EndProcedure
Procedure PrivacyImpactedStateChange(*THIS.DispatchObject,bPrivacyImpacted.l)
Debug "----------------------------------------------"
Debug "bPrivacyImpacted"
Debug bPrivacyImpacted
EndProcedure
Procedure ProgressChange(*THIS.DispatchObject,nProgress.l, nProgressMax.l)
Protected Progress.l
Debug "----------------------------------------------"
Debug "ProgressChange"
Debug nProgress
Debug nProgressMax
If nProgressMax>0
Progress=nProgress*100/nProgressMax
SetGadgetState(2, Progress)
Else
SetGadgetState(2, 0)
EndIf
EndProcedure
Procedure PropertyChange(*THIS.DispatchObject,*sProperty.l)
Debug "----------------------------------------------"
Debug "PropertyChange"
Debug PeekL(*sProperty-4)
Debug PeekS(*sProperty,-1,#PB_Unicode)
EndProcedure
Procedure SetSecureLockIcon(*THIS.DispatchObject,SecureLockIcon.l)
Debug "----------------------------------------------"
; SecureLockIcon Constants
; secureLockIconUnsecure = 0
; secureLockIconMixed = 1
; secureLockIconSecureUnknownBits = 2
; secureLockIconSecure40Bit = 3
; secureLockIconSecure56Bit = 4
; secureLockIconSecureFortezza = 5
; secureLockIconSecure128Bit = 6
Debug "SetSecureLockIcon"
Debug SecureLockIcon
EndProcedure
Procedure StatusTextChange(*THIS.DispatchObject,*sText.l)
Protected Texte.s
; Debug "----------------------------------------------"
; Debug "StatusTextChange"
; Debug PeekL(*sText-4)
Texte.s= PeekS(*sText,-1,#PB_Unicode)
StatusBarText(0, 0, Texte)
EndProcedure
Procedure TitleChange(*THIS.DispatchObject,*sText.l)
Protected Texte.s
; Debug "----------------------------------------------"
; Debug "TitleChange"
; Debug PeekL(*sText-4)
Texte=PeekS(*sText,-1,#PB_Unicode)
element=GetGadgetState(0)
SetGadgetItemText(0, element, Texte, 0)
EndProcedure
Procedure WindowClosing(*THIS.DispatchObject,bIsChildWindow.l, *Cancel.LONG)
Debug "----------------------------------------------"
Debug "WindowClosing"
Debug bIsChildWindow
EndProcedure
Procedure WindowSetLeft(*THIS.DispatchObject,nLeft.l)
Debug "----------------------------------------------"
Debug "WindoSetLeft"
EndProcedure
Procedure WindowSetTop(*THIS.DispatchObject,nTop.l)
Debug "----------------------------------------------"
Debug "WindoSetTop"
EndProcedure
Procedure WindowSetWidth(*THIS.DispatchObject,nWidth.l)
Debug "----------------------------------------------"
Debug "WindoSetTop"
EndProcedure
Procedure WindowSetHeight(*THIS.DispatchObject,nHeight.l)
Debug "----------------------------------------------"
Debug "WindoSetHeight"
EndProcedure
Procedure WindowSetResizable(*THIS.DispatchObject,bResizable.l)
Debug "----------------------------------------------"
Debug "WindowSetResizable"
Debug bResizable
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,?IID_DWebBrowserEvents2,16)
CallDebugger
EndIf
If CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID)) Or CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
*Object\l = *THIS
AddRef(*THIS.DispatchObject)
ProcedureReturn #S_OK
Else
*Object\l = 0
ProcedureReturn #E_NOINTERFACE
EndIf
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 Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, *pDispParams.DISPPARAMS, pVarResult, pExcepInfo, puArgErr)
Select dispIDMember
Case #DISPID_BEFORENAVIGATE2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*6)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*5)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*4)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*3)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*2)
*params6.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params7.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
BeforeNavigate2(*THIS,*params1\pdispVal,*params2\pvarVal,*params3\pvarVal,*params4\pvarVal,*params5\pvarVal,*params6\pvarVal,*params2\pboolVal)
Case #DISPID_CLIENTTOHOSTWINDOW
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
ClientToHostWindow(*THIS,*params1\plVal, *params2\plVal)
Case #DISPID_COMMANDSTATECHANGE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
CommandStateChange(*THIS,*params1\lVal, *params2\boolVal)
Case #DISPID_DOCUMENTCOMPLETE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
DocumentComplete(*THIS,*params1\pDispVal, *params2\pvarVal)
Case #DISPID_DOWNLOADBEGIN
DownloadBegin(*THIS)
Case #DISPID_DOWNLOADCOMPLETE
DownloadComplete(*THIS)
Case #DISPID_FILEDOWNLOAD
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
FileDownload(*THIS,*params1\pBoolVal, *params2\pBoolVal)
Case #DISPID_NAVIGATECOMPLETE2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NavigateComplete2(*THIS,*params1\pDispVal, *params2\pvarVal)
Case #DISPID_NAVIGATEERROR
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*4)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*3)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*2)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NavigateError(*THIS,*params1\pdispVal, *params2\pvarVal, *params3\pvarVal, *params4\pvarVal, *params5\pboolVal)
Case #DISPID_NEWWINDOW2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NewWindow2(*THIS,*params1\ppdispVal, *params2\pboolVal)
Case #DISPID_ONFULLSCREEN
*params.VARIANT = *pDispParams\rgvarg
OnFullScreen(*THIS,*params\boolVal)
Case #DISPID_ONMENUBAR
*params.VARIANT = *pDispParams\rgvarg
OnMenuBar(*THIS,*params\boolVal)
Case #DISPID_ONQUIT
OnQuit(*THIS)
Case #DISPID_ONSTATUSBAR
*params.VARIANT = *pDispParams\rgvarg
OnStatusBar(*THIS,*params\boolVal)
Case #DISPID_ONTHEATERMODE
*params1.VARIANT = *pDispParams\rgvarg
OnTheaterMode(*THIS,*params1\boolVal)
Case #DISPID_ONTOOLBAR
*params.VARIANT = *pDispParams\rgvarg
OnToolbar(*THIS,*params\boolVal)
Case #DISPID_ONVISIBLE
*params.VARIANT = *pDispParams\rgvarg
OnVisible(*THIS,*params\boolVal)
Case #DISPID_PRINTTEMPLATEINSTANTIATION
*params.VARIANT = *pDispParams\rgvarg
PrintTemplateInstantiation(*THIS,*params\pdispVal)
Case #DISPID_PRINTTEMPLATETEARDOWN
*params.VARIANT = *pDispParams\rgvarg
PrintTemplateTeardown(*THIS,*params\pdispVal)
Case #DISPID_PRIVACYIMPACTEDSTATECHANGE
*params.VARIANT = *pDispParams\rgvarg
PrivacyImpactedStateChange(*THIS,*params\boolVal)
Case #DISPID_PROGRESSCHANGE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
ProgressChange(*THIS,*params1\lVal, *params2\lVal)
Case #DISPID_PROPERTYCHANGE
*params.VARIANT = *pDispParams\rgvarg
PropertyChange(*THIS,*params\bstrVal)
Case #DISPID_SETSECURELOCKICON
*params.VARIANT = *pDispParams\rgvarg
SetSecureLockIcon(*THIS,*params\lVal)
Case #DISPID_STATUSTEXTCHANGE
*params.VARIANT = *pDispParams\rgvarg
StatusTextChange(*THIS,*params\bstrval)
Case #DISPID_TITLECHANGE
*params.VARIANT = *pDispParams\rgvarg
TitleChange(*THIS,*params\bstrVal)
Case #DISPID_WINDOWCLOSING
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
WindowClosing(*THIS,*params1\boolVal, *params2\pboolVal)
Case #DISPID_WINDOWSETLEFT
*params.VARIANT = *pDispParams\rgvarg
WindowSetLeft(*THIS,*params\lVal)
Case #DISPID_WINDOWSETTOP
*params.VARIANT = *pDispParams\rgvarg
WindowSetTop(*THIS,*params\lVal)
Case #DISPID_WINDOWSETWIDTH
*params.VARIANT = *pDispParams\rgvarg
WindowSetWidth(*THIS,*params\lVal)
Case #DISPID_WINDOWSETHEIGHT
*params.VARIANT = *pDispParams\rgvarg
WindowSetHeight(*THIS,*params\lVal)
Case #DISPID_WINDOWSETRESIZABLE
*params.VARIANT = *pDispParams\rgvarg
WindowSetResizable(*THIS,*params\boolVal)
EndSelect
EndProcedure
;---------------------------------------------------------------------------------------------
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/german/")
WebGadget(10,10,10,600,380, "About:blank")
CloseGadgetList()
ProgressBarGadget(2, 10, 10, 200, 20, 0, 100)
AddElement(DispatchObject())
DispatchObject()\IDispatch = ?dispatchFunctions
DispatchObject()\GadgetID=1
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(1), #GWL_USERDATA)
webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
connectionPointContainer\findconnectionpoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)
connectionPoint\Advise(DispatchObject(), @Cookie)
connectionPoint\release()
connectionPointContainer\release()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
End
DataSection
dispatchFunctions:
Data.l @QueryInterface(),@AddRef(),@Release(),@GetTypeInfoCount()
Data.l @GetTypeInfo(),@GetIDsOfNames(),@Invoke()
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
EndDataSection
#DISPID_NEWWINDOW3, work with XP sp2, i think:
Code: Select all
Procedure NewWindow3(*ppDisp.LONG, *Cancel.LONG, dwFlags.l, *bstrUrlContext, *bstrUrl)
Debug "NewWindow3"
Debug PeekS(*bstrUrl,-1,#PB_Unicode)
Nouvelle_url.s= PeekS(*bstrUrl,-1,#PB_Unicode)
SetGadgetText(0,Nouvelle_url), your webgadget
*Cancel\l=1
EndProcedure
Code: Select all
Case #DISPID_NEWWINDOW3
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*4)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*3)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*2)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NewWindow3(*params1\ppdispVal, *params2\pboolVal, *params3\lVal, *params4\bstrVal, *params5\bstrVal)
Last edited by Nico on Thu May 22, 2008 10:19 pm, edited 1 time in total.
Nico
I add a second webgadget and it works. But how can i identify for which gadget are every event?
I add a second webgadget and it works. But how can i identify for which gadget are every event?
Code: Select all
;- Implementation af the IDispatch interface
; Original code posted by soerenkj
; Completed by Nico
;//
;// 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
EndStructure
Global NewList dispatchObject.DispatchObject()
Procedure BeforeNavigate2(*pDisp.IDispatch, *Url.VARIANT, *Flags.VARIANT, *TargetFrameName.VARIANT, *PostData.VARIANT, *Headers.VARIANT, *Cancel.Long)
Debug "----------------------------------------------"
Debug "BeforeNavigate2"
Debug PeekL(*Url\bstrVal-4)
Debug PeekS(*Url\bstrVal,-1,#PB_Unicode)
EndProcedure
Procedure ClientToHostWindow(*CX.Long, *CY.Long)
Debug "----------------------------------------------"
Debug "ClientToHostWindow"
Debug *CX\l
Debug *CY\l
EndProcedure
Procedure CommandStateChange(Command.l, Enable.l)
Debug "----------------------------------------------"
;Valeur pour la Variable Command
; #CSC_UPDATECOMMANDS = $FFFFFFFF
; #CSC_NAVIGATEFORWARD = $00000001
; #CSC_NAVIGATEBACK = $00000002
Debug "CommandStateChange"
Debug Command
Debug Enable
EndProcedure
Procedure DocumentComplete(*pDisp.IDispatch, *Url.VARIANT)
Debug "----------------------------------------------"
Debug "DocumentComplete"
Debug PeekL(*Url\bstrVal-4)
Debug PeekS(*Url\bstrVal,-1,#PB_Unicode)
EndProcedure
Procedure DownloadComplete()
Debug "----------------------------------------------"
Debug "DownloadComplete"
EndProcedure
Procedure DownloadBegin()
Debug "----------------------------------------------"
Debug "DownloadBegin"
EndProcedure
Procedure FileDownload(*bActiveDocument.Long, *bCancel.Long)
Debug "----------------------------------------------"
Debug "FileDownload"
Debug *bActiveDocument\l
Debug *bCancel\l
EndProcedure
Procedure NavigateComplete2(*pDisp.IDispatch, *Url.VARIANT)
Debug "----------------------------------------------"
Debug "NavigateComplete2"
If *Url\vt = 8 ;#VT_BSTR
Debug PeekL(*Url\bstrVal-4)
Debug PeekS(*Url\bstrVal,-1,#PB_Unicode)
EndIf
EndProcedure
Procedure NavigateError(*pDisp.IDispatch, *Url.VARIANT, *TargetFrameName.VARIANT, *StatusCode.VARIANT, *Cancel.Long)
Debug "----------------------------------------------"
Debug "NavigateError"
If *Url\vt = 8 ;#VT_BSTR
Debug PeekL(*Url\bstrVal-4)
Debug PeekS(*Url\bstrVal,-1,#PB_Unicode)
EndIf
EndProcedure
Procedure NewWindow2(*ppDisp.Long, *Cancel.Long)
Debug "----------------------------------------------"
Debug "NewWindow2"
Debug *Cancel\l
EndProcedure
Procedure OnFullScreen(FullScreen.l)
Debug "----------------------------------------------"
Debug "OnFullScreen"
Debug FullScreen
EndProcedure
Procedure OnMenuBar(MenuBar.l)
Debug "----------------------------------------------"
Debug "OnMenuBar"
Debug "MenuBar"
EndProcedure
Procedure OnQuit()
Debug "----------------------------------------------"
Debug "OnQuit"
EndProcedure
Procedure OnStatusBar(StatusBar.l)
Debug "----------------------------------------------"
Debug "OnStatusBar"
Debug "StatusBar"
EndProcedure
Procedure OnTheaterMode(TheaterMode.l)
Debug "----------------------------------------------"
Debug "OnTheaterMode"
EndProcedure
Procedure OnToolBar(ToolBar.l)
Debug "----------------------------------------------"
Debug "OnToolBar"
Debug "ToolBar"
EndProcedure
Procedure OnVisible(vVisible.l)
Debug "----------------------------------------------"
Debug "OnVisible"
Debug "vVisible"
EndProcedure
Procedure PrintTemplateInstantiation(*pDisp.IDispatch)
Debug "----------------------------------------------"
;PrintTemplateInstantiation was introduced in Microsoft Internet Explorer 6
Debug "PrintTemplateInstantiation"
EndProcedure
Procedure PrintTemplateTeardown(*pDisp.IDispatch)
Debug "----------------------------------------------"
;PrintTemplateTeardown was introduced in Microsoft Internet Explorer 6
Debug "PrintTemplateTeardown"
EndProcedure
Procedure PrivacyImpactedStateChange(bPrivacyImpacted.l)
Debug "----------------------------------------------"
Debug "bPrivacyImpacted"
Debug bPrivacyImpacted
EndProcedure
Procedure ProgressChange(nProgress.l, nProgressMax.l)
Debug "----------------------------------------------"
Debug "ProgressChange"
Debug nProgress
Debug nProgressMax
EndProcedure
Procedure PropertyChange(*sProperty.l)
Debug "----------------------------------------------"
Debug "PropertyChange"
Debug PeekL(*sProperty-4)
Debug PeekS(*sProperty,-1,#PB_Unicode)
EndProcedure
Procedure SetSecureLockIcon(SecureLockIcon.l)
Debug "----------------------------------------------"
; SecureLockIcon Constants
; secureLockIconUnsecure = 0
; secureLockIconMixed = 1
; secureLockIconSecureUnknownBits = 2
; secureLockIconSecure40Bit = 3
; secureLockIconSecure56Bit = 4
; secureLockIconSecureFortezza = 5
; secureLockIconSecure128Bit = 6
Debug "SetSecureLockIcon"
Debug SecureLockIcon
EndProcedure
Procedure StatusTextChange(*sText.l)
Debug "----------------------------------------------"
Debug "StatusTextChange"
Debug PeekL(*sText-4)
Debug PeekS(*sText,-1,#PB_Unicode)
EndProcedure
Procedure TitleChange(*sText.l)
Debug "----------------------------------------------"
Debug "TitleChange"
Debug PeekL(*sText-4)
Debug PeekS(*sText,-1,#PB_Unicode)
EndProcedure
Procedure WindowClosing(bIsChildWindow.l, *Cancel.Long)
Debug "----------------------------------------------"
Debug "WindowClosing"
Debug bIsChildWindow
EndProcedure
Procedure WindowSetLeft(nLeft.l)
Debug "----------------------------------------------"
Debug "WindoSetLeft"
EndProcedure
Procedure WindowSetTop(nTop.l)
Debug "----------------------------------------------"
Debug "WindoSetTop"
EndProcedure
Procedure WindowSetWidth(nWidth.l)
Debug "----------------------------------------------"
Debug "WindoSetTop"
EndProcedure
Procedure WindowSetHeight(nHeight.l)
Debug "----------------------------------------------"
Debug "WindoSetHeight"
EndProcedure
Procedure WindowSetResizable(bResizable.l)
Debug "----------------------------------------------"
Debug "WindowSetResizable"
Debug bResizable
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,?IID_DWebBrowserEvents2,16)
CallDebugger
EndIf
If CompareMemory(*iid, ?IID_IUnknown, SizeOf(GUID)) Or CompareMemory(*iid, ?IID_IDispatch, SizeOf(GUID))
*Object\l = *THIS
AddRef(*THIS.DispatchObject)
ProcedureReturn #S_OK
Else
*Object\l = 0
ProcedureReturn #E_NOINTERFACE
EndIf
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 Invoke(*THIS.DispatchObject, dispIdMember, riid, lcid, wFlags, *pDispParams.DISPPARAMS, pVarResult, pExcepInfo, puArgErr)
Select dispIdMember
Case #DISPID_BEFORENAVIGATE2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*6)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*5)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*4)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*3)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*2)
*params6.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params7.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
BeforeNavigate2(*params1\pdispVal,*params2\pvarVal,*params3\pvarVal,*params4\pvarVal,*params5\pvarVal,*params6\pvarVal,*params2\pboolVal)
Case #DISPID_CLIENTTOHOSTWINDOW
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
ClientToHostWindow(*params1\plVal, *params2\plVal)
Case #DISPID_COMMANDSTATECHANGE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
CommandStateChange(*params1\lVal, *params2\boolVal)
Case #DISPID_DOCUMENTCOMPLETE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
DocumentComplete(*params1\pdispVal, *params2\pvarVal)
Case #DISPID_DOWNLOADBEGIN
DownloadBegin()
Case #DISPID_DOWNLOADCOMPLETE
DownloadComplete()
Case #DISPID_FILEDOWNLOAD
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
FileDownload(*params1\pboolVal, *params2\pboolVal)
Case #DISPID_NAVIGATECOMPLETE2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NavigateComplete2(*params1\pdispVal, *params2\pvarVal)
Case #DISPID_NAVIGATEERROR
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*4)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*3)
*params3.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*2)
*params4.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params5.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NavigateError(*params1\pdispVal, *params2\pvarVal, *params3\pvarVal, *params4\pvarVal, *params5\pboolVal)
Case #DISPID_NEWWINDOW2
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
NewWindow2(*params1\ppdispVal, *params2\pboolVal)
Case #DISPID_ONFULLSCREEN
*params.VARIANT = *pDispParams\rgvarg
OnFullScreen(*params\boolVal)
Case #DISPID_ONMENUBAR
*params.VARIANT = *pDispParams\rgvarg
OnMenuBar(*params\boolVal)
Case #DISPID_ONQUIT
OnQuit()
Case #DISPID_ONSTATUSBAR
*params.VARIANT = *pDispParams\rgvarg
OnStatusBar(*params\boolVal)
Case #DISPID_ONTHEATERMODE
*params1.VARIANT = *pDispParams\rgvarg
OnTheaterMode(*params1\boolVal)
Case #DISPID_ONTOOLBAR
*params.VARIANT = *pDispParams\rgvarg
OnToolBar(*params\boolVal)
Case #DISPID_ONVISIBLE
*params.VARIANT = *pDispParams\rgvarg
OnVisible(*params\boolVal)
Case #DISPID_PRINTTEMPLATEINSTANTIATION
*params.VARIANT = *pDispParams\rgvarg
PrintTemplateInstantiation(*params\pdispVal)
Case #DISPID_PRINTTEMPLATETEARDOWN
*params.VARIANT = *pDispParams\rgvarg
PrintTemplateTeardown(*params\pdispVal)
Case #DISPID_PRIVACYIMPACTEDSTATECHANGE
*params.VARIANT = *pDispParams\rgvarg
PrivacyImpactedStateChange(*params\boolVal)
Case #DISPID_PROGRESSCHANGE
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
ProgressChange(*params1\lVal, *params2\lVal)
Case #DISPID_PROPERTYCHANGE
*params.VARIANT = *pDispParams\rgvarg
PropertyChange(*params\bstrVal)
Case #DISPID_SETSECURELOCKICON
*params.VARIANT = *pDispParams\rgvarg
SetSecureLockIcon(*params\lVal)
Case #DISPID_STATUSTEXTCHANGE
*params.VARIANT = *pDispParams\rgvarg
StatusTextChange(*params\bstrVal)
Case #DISPID_TITLECHANGE
*params.VARIANT = *pDispParams\rgvarg
TitleChange(*params\bstrVal)
Case #DISPID_WINDOWCLOSING
*params1.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*1)
*params2.VARIANT = *pDispParams\rgvarg +(SizeOf(VARIANT)*0)
WindowClosing(*params1\boolVal, *params2\pboolVal)
Case #DISPID_WINDOWSETLEFT
*params.VARIANT = *pDispParams\rgvarg
WindowSetLeft(*params\lVal)
Case #DISPID_WINDOWSETTOP
*params.VARIANT = *pDispParams\rgvarg
WindowSetTop(*params\lVal)
Case #DISPID_WINDOWSETWIDTH
*params.VARIANT = *pDispParams\rgvarg
WindowSetWidth(*params\lVal)
Case #DISPID_WINDOWSETHEIGHT
*params.VARIANT = *pDispParams\rgvarg
WindowSetHeight(*params\lVal)
Case #DISPID_WINDOWSETRESIZABLE
*params.VARIANT = *pDispParams\rgvarg
WindowSetResizable(*params\boolVal)
EndSelect
EndProcedure
;
; ;Declare an instance
; dispatch.IDispatch = @dispatchObject
AddElement(dispatchObject())
dispatchObject()\IDispatch = ?dispatchFunctions
;---------------------------------------------------------------------------------------------
OpenWindow(0,0,0,640,480,"Test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
WebGadget(0,0,0,640,240, "http://www.purebasic.com/")
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)
webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
connectionPointContainer\findconnectionpoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)
connectionPoint\Advise(dispatchObject(), @Cookie)
WebGadget(1,0,240,640,240, "http://www.google.com/")
webBrowser.IWebBrowser2 = GetWindowLong_(GadgetID(1), #GWL_USERDATA)
webBrowser\QueryInterface(?IID_IConnectionPointContainer, @connectionPointContainer.IConnectionPointContainer)
connectionPointContainer\findconnectionpoint(?IID_DWebBrowserEvents2, @connectionPoint.IConnectionPoint)
connectionPoint\Advise(dispatchObject(), @Cookie)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
connectionPoint\UnAdvise(Cookie)
connectionPoint\Release()
connectionPointContainer\Release()
End
DataSection
dispatchFunctions:
Data.l @QueryInterface(),@AddRef(),@Release(),@GetTypeInfoCount()
Data.l @GetTypeInfo(),@GetIDsOfNames(),@Invoke()
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
EndDataSection