IonicWind Software

IWBasic => Network Client/Server programming => Topic started by: Logman on March 20, 2009, 06:27:58 AM

Title: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: Logman on March 20, 2009, 06:27:58 AM
Quick question; don't know if this is the right forum, but I'm using NC/S programming.

I have included a browser window in my code, which brings up HTML/CSS coded web pages. Some of the web pages perform DOM routines using Javascript.

Is there anyway to set up Global variables that can be accessed/altered by both the Javascript in the browser window and the EBasic code? What I'm trying to avoid is having to communicate variable parameters back to the main code using forms-type messaging (?action=post; etc.) or cookies.

Logman
Title: Re: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: sapero on March 20, 2009, 07:42:16 AM
This example shows how to access variables using the disphelper:WINDOW win
OPENWINDOW win,0,0,200,100,@NOAUTODRAW|@SIZE|@MINBOX|@MAXBOX,0,"BROWSER TEST",&handler
CENTERWINDOW win
ATTACHBROWSER win

' force the browser to b created
BROWSECMD win,@NAVIGATE, "about:blank"

' create example page with scripting variable
FILE f
openfile f, GetStartPath()+"1.htm", "w"
write f, "<html><body>"
write f, "<script>var MyVariable=5;</script>"
write f, "<button id=clickme onclick='return alert(MyVariable);'>show MyVariable</button>"
write f, "</body></html>"
closefile f

' open the page
BROWSECMD win,@NAVIGATE, GetStartPath()+"1.htm"
IDispatch dsp = GetBrowserDispatch(win)

' wait until not loaded
int busy=1
while busy
wait
GetComProperty(dsp,"%b",&busy,"Busy")
wend

' query the current MyVariable value, then change it.
int value
IDispatch document
GetComProperty(dsp,"%o",&document,"Document.script")
GetComProperty(document,"%d",&value,"MyVariable")

MessageBox win, "MyVariable is "+str$(value),""
' change MyVariable value
SetComProperty(document,"MyVariable = %d", 12345)
' click the button
CallObjectMethod(document, "clickme.click()")

document->Release()
dsp->Release()
waituntil win.hwnd=0


sub handler
if (@message = @idclosewindow) then closewindow win
endsub



extern _IID_IWebBrowser2 as GUID
sub GetBrowserDispatch(WINDOW w),comref
declare import, GetPropA(int hwnd,string name),pointer
pointer p = GetPropA(w.hwnd, "BROWSER")
IDispatch dsp = 0
if (p)
dsp = *<comref>p
dsp->QueryInterface(_IID_IWebBrowser2, &dsp)
endif
return dsp
endsub
Title: Re: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: Logman on March 20, 2009, 08:03:10 AM
Sapero:

Excellent and elegant.

Thanks.

Logman
Title: Re: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: Logman on March 24, 2009, 10:27:31 AM
Sapero:

I got your code snippets up and running just fine. I really appreciated your help.

Now I'd like to understand the underlying COM/OLE Automation implementation by studying the COM usage and Javascript objects in my web pages.

Could you tell me which 'include' files contain _IID_IWebBrowser2, GetPropA, QueryInterface, etc.?

I thought they were in the 'shell.inc' file, but I can't locate them so I can study them.

Thanks ???

Logman
Title: Re: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: sapero on March 24, 2009, 11:46:50 AM
The exdisp.inc header defines the root webbrowser interfaces and guids. It includes also windows stuff and base com and ole interfaces.
Optional mshtml.inc allows you to iterate though document, window, forms, buttons, options... elements, directly execute methods and set properties, but it requires much more code.
For example the call to GetComProperty you may replace with
' query the current MyVariable value, then change it.
int value

$include "exdisp.inc"
$include "mshtml.inc"
IDispatch document

$ifdef never

GetComProperty(dsp,"%o",&document,"Document.script") ' using disphelper

$else

IDispatch temp
IWebBrowser2 browser = dsp
if ((browser->get_Document(&temp) = 0) and temp)
IHTMLDocument doc1
if (temp->QueryInterface(_IID_IHTMLDocument, &doc1) = 0) ' using raw methods
doc1->get_script(&document)
doc1->Release()
endif
temp->Release()
endif

$endif
Title: Re: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: Logman on March 24, 2009, 01:04:22 PM
Very cool! ;D

Being fairly new to EBasic, I take it that you did all the work in porting/translating 'exdisp.inc' and 'mshtml.inc'. If so, thanks.

I should have know there were additional include files I didn't have on my system at home when I first ran the program. At work, I installed the additional set of includes I got from you and the program ran flawlessly.

Question: what's the difference, for instance, between using _IID_IWebBrowser2 and just plain _IID_IWebBrowser in the 'exdisp.inc' file? I would not have caught that without your help, but don't understand the difference.

Thanks again.

Logman
Title: Re: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: sapero on March 24, 2009, 01:23:40 PM
Open the exdisp header and find "interface IWebBrowser", remember the last method name (get_Busy).
Now find "interface IWebBrowser2", then inside it find the get_Busy method:
stdmethod get_Busy(pointer pBool),HRESULT
'IWebBrowserApp methods
stdmethod Quit(),HRESULT
... 19 more methods
'IWebBrowser2 methods
stdmethod Navigate2
... 18 more methods
endinterface

If you don't need the additional methods, you may query for IWebBrowser or IWebBrowserApp interface only, but IWebBrowser2 is the standard for today.
Title: Re: Communicating Variables Between EBASIC and BROWSER Javascript
Post by: Logman on March 24, 2009, 01:55:01 PM
Got it!

Very nice work!

Logman