Code: Select all
CompilerIf #PB_Compiler_IsMainFile
EnableExplicit
CompilerEndIf
Enumeration ; VARENUM
#VT_EMPTY = 0
#VT_NULL = 1
#VT_I2 = 2
#VT_I4 = 3
#VT_R4 = 4
#VT_R8 = 5
#VT_CY = 6
#VT_DATE = 7
#VT_BSTR = 8
#VT_DISPATCH = 9
#VT_ERROR = 10
#VT_BOOL = 11
#VT_VARIANT = 12
#VT_UNKNOWN = 13
#VT_DECIMAL = 14
#VT_I1 = 16
#VT_UI1 = 17
#VT_UI2 = 18
#VT_UI4 = 19
#VT_I8 = 20
#VT_UI8 = 21
#VT_INT = 22
#VT_UINT = 23
#VT_VOID = 24
#VT_HRESULT = 25
#VT_PTR = 26
#VT_SAFEARRAY = 27
#VT_CARRAY = 28
#VT_USERDEFINED = 29
#VT_LPSTR = 30
#VT_LPWSTR = 31
#VT_RECORD = 36
#VT_INT_PTR = 37
#VT_UINT_PTR = 38
#VT_FILETIME = 64
#VT_BLOB = 65
#VT_STREAM = 66
#VT_STORAGE = 67
#VT_STREAMED_OBJECT = 68
#VT_STORED_OBJECT = 69
#VT_BLOB_OBJECT = 70
#VT_CF = 71
#VT_CLSID = 72
#VT_VERSIONED_STREAM = 73
#VT_BSTR_BLOB = $fff
#VT_VECTOR = $1000
#VT_ARRAY = $2000
#VT_BYREF = $4000
#VT_RESERVED = $8000
#VT_ILLEGAL = $ffff
#VT_ILLEGALMASKED = $fff
#VT_TYPEMASK = $fff
EndEnumeration
#DISPATCH_METHOD = $1
#DISPATCH_PROPERTYGET = $2
#DISPATCH_PROPERTYPUT = $4
#DISPATCH_PROPERTYPUTREF = $8
DataSection
IID_IHTMLDocument: ; {626FC520-A41E-11CF-A731-00A0C9082637}
Data.l $626FC520
Data.w $A41E, $11CF
Data.b $A7, $31, $00, $A0, $C9, $08, $26, $37
IID_NULL: ; {00000000-0000-0000-0000-000000000000}
Data.l $00000000
Data.w $0000, $0000
Data.b $00, $00, $00, $00, $00, $00, $00, $00
EndDataSection
Procedure.s StringFromVARIANT(*var.VARIANT)
Protected Result$
If VariantChangeType_(*var, *var, $2, #VT_BSTR) = #S_OK
Result$ = PeekS(*var\bstrVal, PeekL(*var\bstrVal - 4))
SysFreeString_(*var\bstrVal)
Else
Result$ = "ERROR : Cannot convert VARIANT to String!"
EndIf
ProcedureReturn Result$
EndProcedure
Procedure.s ExecuteJavaScript(Gadget.i, Function$, Arguments$, Separator$)
Protected.i result, Count, i
Protected Result$, Message$
Protected *dispID, *bstr_command, *Arguments
Protected Browser.IWebBrowser2
Protected DocumentDispatch.IDispatch, ScriptDispatch.IDispatch
Protected Document.IHTMLDocument
Protected *Arg.VARIANT, varResult.VARIANT
Protected params.DISPPARAMS
Result$ = "ERROR"
Browser = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
If Browser\get_Document(@DocumentDispatch) = #S_OK
If DocumentDispatch\QueryInterface(?IID_IHTMLDocument, @Document) = #S_OK
If Document\get_Script(@ScriptDispatch) = #S_OK
*bstr_command = SysAllocString_(Function$)
result = ScriptDispatch\GetIDsOfNames(?IID_NULL, @*bstr_command, 1, 0, @*dispID)
If result = #S_OK
; parse the arguments
;
If Trim(Arguments$) = ""
Count = 0
*Arguments = 0
Else
Count = CountString(Arguments$, Separator$)+1
*Arguments = AllocateMemory(SizeOf(VARIANT)*Count)
*Arg = *Arguments
For i = 1 To Count
*Arg\vt = #VT_BSTR
*Arg\bstrVal = SysAllocString_(Trim(StringField(Arguments$, i, Separator$)))
*Arg + SizeOf(VARIANT)
Next i
EndIf
params\cArgs = Count
params\cNamedArgs = 0
params\rgvarg = *Arguments
result = ScriptDispatch\Invoke(*dispID, ?IID_NULL, 0, #DISPATCH_METHOD, @params, @varResult, 0, 0)
If result = #S_OK
Result$ = StringFromVARIANT(@varResult)
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)
Result$ = "ERROR: Invoke() "+Message$
EndIf
If *Arguments
*Arg.VARIANT = *Arguments
For i = 1 To Count
SysFreeString_(*Arg\bstrVal)
*Arg + SizeOf(VARIANT)
Next i
FreeMemory(*Arguments)
EndIf
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)
Result$ = "ERROR: GetIDsOfNames() "+Message$
EndIf
SysFreeString_(*bstr_command)
ScriptDispatch\Release()
EndIf
Document\Release()
EndIf
DocumentDispatch\Release()
EndIf
ProcedureReturn Result$
EndProcedure
Procedure.s GetJSVariable(Gadget.i, Name$)
Protected dispID.i, result.i
Protected Result$, Message$
Protected *bstr_name
Protected Browser.IWebBrowser2
Protected DocumentDispatch.IDispatch, ScriptDispatch.IDispatch
Protected Document.IHTMLDocument
Protected params.DISPPARAMS
Protected varResult.VARIANT
Result$ = "ERROR"
Browser = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
If Browser\get_Document(@DocumentDispatch) = #S_OK
If DocumentDispatch\QueryInterface(?IID_IHTMLDocument, @Document) = #S_OK
If Document\get_Script(@ScriptDispatch) = #S_OK
*bstr_name = SysAllocString_(Name$)
result = ScriptDispatch\GetIDsOfNames(?IID_NULL, @*bstr_name, 1, 0, @dispID)
If result = #S_OK
params\cArgs = 0
params\cNamedArgs = 0
result = ScriptDispatch\Invoke(dispID, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @params, @varResult, 0, 0)
If result = #S_OK
Result$ = StringFromVARIANT(@varResult)
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)
Result$ = "ERROR: Invoke() "+Message$
EndIf
Else
Message$ = Space(3000)
FormatMessage_(#FORMAT_MESSAGE_IGNORE_INSERTS|#FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, @Message$, 3000, 0)
Result$ = "ERROR: GetIDsOfNames() "+Message$
EndIf
SysFreeString_(*bstr_name)
ScriptDispatch\Release()
EndIf
Document\Release()
EndIf
DocumentDispatch\Release()
EndIf
ProcedureReturn Result$
EndProcedure
Procedure SetJSVariable(Gadget, Name$, Value$)
Protected.i success, dispID, result, dispidNamed
Protected *bstr_name
Protected Browser.IWebBrowser2
Protected DocumentDispatch.IDispatch, ScriptDispatch.IDispatch
Protected Document.IHTMLDocument
Protected varValue.VARIANT
Protected params.DISPPARAMS
Browser = GetWindowLong_(GadgetID(Gadget), #GWL_USERDATA)
If Browser\get_Document(@DocumentDispatch) = #S_OK
If DocumentDispatch\QueryInterface(?IID_IHTMLDocument, @Document) = #S_OK
If Document\get_Script(@ScriptDispatch) = #S_OK
*bstr_name = SysAllocString_(Name$)
result = ScriptDispatch\GetIDsOfNames(?IID_NULL, @*bstr_name, 1, 0, @dispID)
If result = #S_OK
varValue\vt = #VT_BSTR
varValue\bstrVal = SysAllocString_(Value$)
dispidNamed = -3 ; #DISPID_PROPERTYPUT
params\cArgs = 1
params\cNamedArgs = 1
params\rgvarg = @varValue
params\rgdispidNamedArgs = @dispidNamed
result = ScriptDispatch\Invoke(dispID, ?IID_NULL, 0, #DISPATCH_PROPERTYPUT, @params, 0, 0, 0)
If result = #S_OK
success = 1
EndIf
SysFreeString_(varValue\bstrVal)
EndIf
SysFreeString_(*bstr_name)
ScriptDispatch\Release()
EndIf
Document\Release()
EndIf
DocumentDispatch\Release()
EndIf
ProcedureReturn success
EndProcedure
;-Demo
CompilerIf #PB_Compiler_IsMainFile
EnableExplicit
Enumeration
#Gadget_Web
#Gadget_Command
#Gadget_Args
#Gadget_Text
#Gadget_Button
EndEnumeration
;IncludeFile "Javascript.pbi"
Procedure Resize()
Protected.i Width, Height
Width = WindowWidth(0)
Height = WindowHeight(0)
ResizeGadget(#Gadget_Web, 5, 5, Width-10, Height-60)
ResizeGadget(#Gadget_Command, 5, Height-50, (Width-105)/4, 20)
ResizeGadget(#Gadget_Args, 10+(Width-105)/4, Height-50, ((Width-105)*3)/4, 20)
ResizeGadget(#Gadget_Text, 5, Height-25, Width-10, 20)
ResizeGadget(#Gadget_Button, Width-90, Height-50, 85, 20)
EndProcedure
Define Event.i , Command$, Arguments$, Result$, HTML$
HTML$ = ~"<html>" + #CRLF$
HTML$ + ~" <script language=\"JavaScript\">" + #CRLF$
HTML$ + ~" var xtra = \"Global\";" + #CRLF$
HTML$ + ~" " + #CRLF$
HTML$ + ~" function test(a, b)" + #CRLF$
HTML$ + ~" {" + #CRLF$
HTML$ + ~" return \"a=\"+a+\" b=\"+b;" + #CRLF$
HTML$ + ~" }" + #CRLF$
HTML$ + ~" </script>" + #CRLF$
HTML$ + ~" <body>" + #CRLF$
HTML$ + ~" Test" + #CRLF$
HTML$ + ~" </body>" + #CRLF$
HTML$ + ~"</html>"
Debug HTML$
If OpenWindow(0, 0, 0, 800, 600, "Javascript test", #PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget)
WebGadget(#Gadget_Web, 0, 0, 0, 0, #Null$)
SetGadgetItemText(#Gadget_Web, #PB_Web_HtmlCode, HTML$)
StringGadget(#Gadget_Command, 0, 0, 0, 0, "test")
StringGadget(#Gadget_Args, 0, 0, 0, 0, "argument1,argument2")
TextGadget(#Gadget_Text, 0, 0, 0, 0, "Type commandname into the first, and arguments into the second box. Do not include ()", #PB_Text_Border)
ButtonGadget(#Gadget_Button, 0, 0, 0, 0, "Execute")
Resize()
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_SizeWindow
Resize()
ElseIf Event = #PB_Event_Gadget And EventGadget() = #Gadget_Button
Command$ = GetGadgetText(#GADGET_Command)
Arguments$ = GetGadgetText(#GADGET_Args)
Result$ = ExecuteJavaScript(#Gadget_Web, Command$, Arguments$, ",")
SetGadgetText(#Gadget_Text, "Result: "+Result$)
Debug GetJSVariable(#Gadget_Web, "xtra")
SetJSVariable(#Gadget_Web, "xtra", "Set")
Debug GetJSVariable(#Gadget_Web, "xtra")
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
CompilerEndIf