Code: Select all
var oSys = AkelPad.SystemFunction();
var hAtlLib = oSys.Call("Kernel32::LoadLibraryW", "Atl.dll");
var hMainWnd = AkelPad.GetMainWnd();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var sTitle = "WebBrowser control";
var sWBClass = "AtlAxWin";
var sWBTitle = "Shell.Explorer.2";
var IDWB = 1000;
var hDlg;
var hWndWB;
var oWB;
oSys.Call("Atl::AtlAxWinInit");
AkelPad.WindowRegisterClass(sClass);
AkelPad.CreateDialog(0, sClass, sTitle, 0x90C80040 /*WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_SETFONT*/, 200, 100, 500, 300, hMainWnd, DlgCallback, 0x3 /*CDF_PIXELS|CDF_MODAL*/, 0, 0, "", 0, 0, "|",
0, sWBClass, sWBTitle, 0x50000000 /*WS_VISIBLE|WS_CHILD*/, 0, 0, 500, 300, IDWB, 0);
AkelPad.WindowUnregisterClass(sClass);
oSys.Call("Kernel32::FreeLibrary", hAtlLib);
function DlgCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 272 /*WM_INITDIALOG*/)
{
hDlg = hWnd;
hWndWB = oSys.Call("User32::GetDlgItem", hDlg, IDWB);
oWB = new WebBrowserObject(hWndWB, WebBrowserEvents);
oWB.Navigate("http://akelpad.sourceforge.net");
}
else if (uMsg == 273 /*WM_COMMAND*/)
{
if ((wParam & 0xFFFF) == 2 /*IDCANCEL*/)
{
oWB.Release();
oSys.Call("user32::EndDialog", hDlg, 0);
}
}
return 0;
}
function WebBrowserEvents(nEvent)
{
if (nEvent == 259 /*DISPID_DOCUMENTCOMPLETE*/)
{
WScript.Echo("Document complete.");
}
}
//object constructor
function WebBrowserObject(hWndWB, EventsProc)
{
var lppUnknown=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
var lpUnknown=0;
var lpUnknownVtbl;
var lpUnknown_QueryInterface;
var lpIID_WebBrowser2=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
var lppWebBrowser2=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
var lpWebBrowser2=0;
var lpWebBrowser2Vtbl;
var lpWebBrowser2_QueryInterface;
var lpWebBrowser2_Navigate;
var lpWebBrowser2_Release;
var lpIID_ConnectionPointContainer=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
var lppConnectionPointContainer=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
var lpConnectionPointContainer=0;
var lpConnectionPointContainerVtbl;
var lpConnectionPointContainer_Release;
var lpConnectionPointContainer_FindConnectionPoint;
var lpDIID_DWebBrowserEvents2=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
var lppConnectionPoint=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown**)*/);
var lpConnectionPoint=0;
var lpConnectionPointVtbl;
var lpConnectionPoint_Release;
var lpConnectionPoint_Advise;
var lpConnectionPoint_Unadvise;
var lpdwCookie=AkelPad.MemAlloc(4 /*sizeof(DWORD)*/);
var dwCookie=0;
var lpSinkVtbl;
var lpSink=AkelPad.MemAlloc(_X64?8:4 /*sizeof(IUnknown*)*/);
var aSinkVtbl=[];
var lpIID_IUnknown=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
var lpIID_IDispatch=AkelPad.MemAlloc(16 /*sizeof(IID)*/);
var i;
//Connect to COM events - init
if (!oSys.Call("Atl::AtlAxGetControl", hWndWB, lppUnknown))
{
lpUnknown=AkelPad.MemRead(lppUnknown, 2 /*DT_QWORD*/);
lpUnknownVtbl=AkelPad.MemRead(_PtrAdd(lpUnknown, 0) /*offsetof(IUnknown, lpVtbl)*/, 2 /*DT_QWORD*/);
lpUnknown_QueryInterface=AkelPad.MemRead(_PtrAdd(lpUnknownVtbl, 0) /*offsetof(IUnknownVtbl, QueryInterface)*/, 2 /*DT_QWORD*/);
oSys.Call("ole32::IIDFromString", "{D30C1661-CDAF-11d0-8A3E-00C04FC9E26E}", lpIID_WebBrowser2);
if (!oSys.Call(lpUnknown_QueryInterface, lpUnknown, lpIID_WebBrowser2, lppWebBrowser2))
{
lpWebBrowser2=AkelPad.MemRead(lppWebBrowser2, 2 /*DT_QWORD*/);
lpWebBrowser2Vtbl=AkelPad.MemRead(_PtrAdd(lpWebBrowser2, 0) /*offsetof(IWebBrowser2, lpVtbl)*/, 2 /*DT_QWORD*/);
lpWebBrowser2_QueryInterface=AkelPad.MemRead(_PtrAdd(lpWebBrowser2Vtbl, 0) /*offsetof(IWebBrowser2Vtbl, QueryInterface)*/, 2 /*DT_QWORD*/);
lpWebBrowser2_Release=AkelPad.MemRead(_PtrAdd(lpWebBrowser2Vtbl, _X64?16:8) /*offsetof(IWebBrowser2Vtbl, Release)*/, 2 /*DT_QWORD*/);
lpWebBrowser2_Navigate=AkelPad.MemRead(_PtrAdd(lpWebBrowser2Vtbl, _X64?88:44) /*offsetof(IWebBrowser2Vtbl, Navigate)*/, 2 /*DT_QWORD*/);
oSys.Call("ole32::IIDFromString", "{B196B284-BAB4-101A-B69C-00AA00341D07}", lpIID_ConnectionPointContainer);
if (!oSys.Call(lpWebBrowser2_QueryInterface, lpWebBrowser2, lpIID_ConnectionPointContainer, lppConnectionPointContainer))
{
lpConnectionPointContainer=AkelPad.MemRead(lppConnectionPointContainer, 2 /*DT_QWORD*/);
lpConnectionPointContainerVtbl=AkelPad.MemRead(_PtrAdd(lpConnectionPointContainer, 0) /*offsetof(IConnectionPointContainer, lpVtbl)*/, 2 /*DT_QWORD*/);
lpConnectionPointContainer_Release=AkelPad.MemRead(_PtrAdd(lpConnectionPointContainerVtbl, _X64?16:8) /*offsetof(IConnectionPointContainerVtbl, Release)*/, 2 /*DT_QWORD*/);
lpConnectionPointContainer_FindConnectionPoint=AkelPad.MemRead(_PtrAdd(lpConnectionPointContainerVtbl, _X64?32:16) /*offsetof(IConnectionPointContainerVtbl, FindConnectionPoint)*/, 2 /*DT_QWORD*/);
oSys.Call("ole32::IIDFromString", "{34A715A0-6587-11D0-924A-0020AFC7AC4D}", lpDIID_DWebBrowserEvents2);
if (!oSys.Call(lpConnectionPointContainer_FindConnectionPoint, lpConnectionPointContainer, lpDIID_DWebBrowserEvents2, lppConnectionPoint))
{
lpConnectionPoint=AkelPad.MemRead(lppConnectionPoint, 2 /*DT_QWORD*/);
lpConnectionPointVtbl=AkelPad.MemRead(_PtrAdd(lpConnectionPoint, 0) /*offsetof(IConnectionPoint, lpVtbl)*/, 2 /*DT_QWORD*/);
lpConnectionPoint_Release=AkelPad.MemRead(_PtrAdd(lpConnectionPointVtbl, _X64?16:8) /*offsetof(IConnectionPointVtbl, Release)*/, 2 /*DT_QWORD*/);
lpConnectionPoint_Advise=AkelPad.MemRead(_PtrAdd(lpConnectionPointVtbl, _X64?40:20) /*offsetof(IConnectionPointVtbl, Advise)*/, 2 /*DT_QWORD*/);
lpConnectionPoint_Unadvise=AkelPad.MemRead(_PtrAdd(lpConnectionPointVtbl, _X64?48:24) /*offsetof(IConnectionPointVtbl, Unadvise)*/, 2 /*DT_QWORD*/);
aSinkVtbl=[oSys.RegisterCallback(Sink_QueryInterface),
oSys.RegisterCallback(Sink_AddRef),
oSys.RegisterCallback(Sink_Release),
oSys.RegisterCallback(Sink_GetTypeInfoCount),
oSys.RegisterCallback(Sink_GetTypeInfo),
oSys.RegisterCallback(Sink_GetIDsOfNames),
oSys.RegisterCallback(Sink_Invoke)];
lpSinkVtbl=AkelPad.MemAlloc((_X64?8:4 /*sizeof(PROC)*/) * aSinkVtbl.length);
for (i=0; i < aSinkVtbl.length; ++i)
AkelPad.MemCopy(_PtrAdd(lpSinkVtbl, i * (_X64?8:4 /*sizeof(PROC)*/)), aSinkVtbl[i], 2 /*DT_QWORD*/);
AkelPad.MemCopy(_PtrAdd(lpSink, 0) /*lpSink->lpVtbl*/, lpSinkVtbl, 2 /*DT_QWORD*/);
oSys.Call("ole32::IIDFromString", "{00000000-0000-0000-C000-000000000046}", lpIID_IUnknown);
oSys.Call("ole32::IIDFromString", "{00020400-0000-0000-C000-000000000046}", lpIID_IDispatch);
if (!oSys.Call(lpConnectionPoint_Advise, lpConnectionPoint, lpSink, lpdwCookie))
dwCookie=AkelPad.MemRead(lpdwCookie, 3 /*DT_DWORD*/);
}
}
}
}
//Connect to COM events - sink
function Sink_QueryInterface(thisObj, vTableGuid, ppv)
{
if (oSys.Call("ole32::IsEqualGUID", vTableGuid, lpDIID_DWebBrowserEvents2) ||
oSys.Call("ole32::IsEqualGUID", vTableGuid, lpIID_IUnknown) ||
oSys.Call("ole32::IsEqualGUID", vTableGuid, lpIID_IDispatch))
{
AkelPad.MemCopy(ppv, thisObj, 2 /*DT_QWORD*/);
return 0 /*S_OK*/;
}
AkelPad.MemCopy(ppv, 0, 2 /*DT_QWORD*/);
return 0x80004002 /*E_NOINTERFACE*/;
}
function Sink_AddRef(thisObj)
{
return 0;
}
function Sink_Release(thisObj)
{
return 0;
}
function Sink_GetTypeInfoCount(thisObj, pCount)
{
AkelPad.MemCopy(pCount, 0, 3 /*DT_DWORD*/);
return 0 /*S_OK*/;
}
function Sink_GetTypeInfo(thisObj, itinfo, lcid, pTypeInfo)
{
AkelPad.MemCopy(pTypeInfo, 0, 2 /*DT_QWORD*/);
return 0 /*S_OK*/;
}
function Sink_GetIDsOfNames(thisObj, riid, rgszNames, cNames, lcid, rgdispid)
{
return 0 /*S_OK*/;
}
function Sink_Invoke(thisObj, dispid, riid, lcid, wFlags, params, result, pexcepinfo, puArgErr)
{
EventsProc(dispid);
return 0 /*S_OK*/;
}
this.Navigate = function(url)
{
oSys.Call(lpWebBrowser2_Navigate, lpWebBrowser2, url, 0, 0, 0, 0);
};
this.Release = function()
{
//Connect to COM events - release
if (dwCookie)
oSys.Call(lpConnectionPoint_Unadvise, lpConnectionPoint, dwCookie);
for (i=0; i < aSinkVtbl.length; ++i)
{
oSys.UnregisterCallback(aSinkVtbl[i]);
}
if (lpConnectionPoint) oSys.Call(lpConnectionPoint_Release, lpConnectionPoint);
if (lpConnectionPointContainer) oSys.Call(lpConnectionPointContainer_Release, lpConnectionPointContainer);
if (lpWebBrowser2) oSys.Call(lpWebBrowser2_Release, lpWebBrowser2);
AkelPad.MemFree(lppUnknown);
AkelPad.MemFree(lpIID_WebBrowser2);
AkelPad.MemFree(lppWebBrowser2);
AkelPad.MemFree(lpDIID_DWebBrowserEvents2);
AkelPad.MemFree(lpdwCookie);
AkelPad.MemFree(lpIID_ConnectionPointContainer);
AkelPad.MemFree(lppConnectionPointContainer);
AkelPad.MemFree(lppConnectionPoint);
AkelPad.MemFree(lpSink);
AkelPad.MemFree(lpIID_IUnknown);
AkelPad.MemFree(lpIID_IDispatch);
};
}