OnGetExternal

OnGetExternal is called to obtain an IDispatch interface. The following demo shows the interaction  between GetExternal,  Invoke and GetIDsofNames. 

We want the PageSetup-Dialog to be shown, when window.external.pagesetup is called from a script.  If you use the following html-code pagesetup-dialog will pop up when you click a button on the page.

 

Save this code to a file 'Sample.htm':

<HTML><HEAD><TITLE>EmbeddedWB Sample</TITLE>
<SCRIPT>
function doit()
{
window.external.pagesetup;
}
</SCRIPT>
</HEAD>

<BODY>
Click the button to open Webbrowsers Pagesetup-dialog:
<P>
<input type=button 
value="Show Pagesetup"
onClick="doit()">
</BODY></HTML>

Add the following functions to your EmbeddedWB-application:



procedure TForm1.Button1Click(Sender: TObject);
begin
EmbeddedWb1.Go('sample.htm');
end;


function TForm1.EmbeddedWB1GetExternal(out ppDispatch: IDispatch): HRESULT;
begin
ppDispatch := EmbeddedWB1 as IDispatch;
Result := S_OK;
end;

function TForm1.EmbeddedWB1Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params: tagDISPPARAMS; VarResult,
ExcepInfo, ArgErr: Pointer): HRESULT;
begin
if
DispId = 1 then begin
EmbeddedWb1.PageSetup;
Result := S_OK;
end else
result := inherited invoke(dispid, iid, localeid, flags, params, varresult,
ExcepInfo, argerr);
end;

function TForm1.EmbeddedWB1GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HRESULT;
var
oslNames: POleStrList;
pdidDispIds: PDispIDList;
begin
OslNames := Names;
pdidDispIDs := DispIds;
if Lowercase(oslNames[0]) = 'pagesetup' then
begin
Result := S_OK;
pdidDispIDs[0] := 1;
end else
Result := inherited GetIDsOfNames(IID, names, NameCount, LocaleID, DispIDs);
end;

 

 

If you want to explore the full power of OnGetExternal you can download the following demo by Christopher Fairbairn. It shows a different (and more proper) way to use OnGetExternal.

 

Download OnGetExternal Demo by C. Fairbairn

OnGetExternal Demo for Delphi 4 & 5