Тема: JScript: Оконное приложение с графическими ресурсами в одном JS-файле.
Наконец-то форум заработал, теперь могу показать, что я недавно написал. :-)
Пример оконного приложения с графическими ресурсами в одном JS-файле. Использует WinSock.
var VB = new ActiveXObject("htmlfile").parentWindow;
VB.document.write("<script language='VBScript'>Function GetData(Obj, data, num, bytTotal)\nObj.GetData data, num, bytTotal\nGetData = data\nEnd Function</script>");
var
Port = parseInt(Math.random()*100000)% 20000 +9000,
MainSocket = WScript.CreateObject("MSWinsock.Winsock.1","MainSocket_"),
Sockets = {};
MainSocket.LocalPort = Port;
MainSocket.Listen();
Function.prototype.GetResource = function (ResourceName)
{
if (!this.Resources)
{
var UnNamedResourceIndex = 0, _this = this;
this.Resources = {};
function f(match, resType, Content){
_this.Resources[(resType=="[[")?UnNamedResourceIndex++:resType.slice(1,-1)] = Content;}
this.toString().replace(/\/\*(\[(?:[^\[]+)?\[)((?:[\r\n]|.)*?)\]\]\*\//gi, f);
}
return this.Resources[ResourceName];
}
function GetResource(ResourceName) {
return arguments.callee.caller.GetResource(ResourceName)}
function DecodeBase64(textBase64)
{
var Element = new ActiveXObject("MSXml2.DOMDocument").createElement("tmp");
Element.dataType = "bin.base64";
Element.text = textBase64;
return Element.nodeTypedValue;
}
function HTTPGetFileName(Data)
{
var match = Data.match(/^(\w+)\s+\/([^\s]*)\s+([^\s]+)/);
return (match && match[2])? match[2] : null;
}
var Host = this;
function CreateWindow(content, x, y, width, height)
{
var HTASettings = "", e, window;
try {HTASettings = content.match(/<hta[^>]+>/gim)[0].replace(/\r?\n/g, " ").replace(/"/g,"'")} catch (e){};
var
ID = (new Date).valueOf(),
CodeForLinking = "\"<script>moveTo(-300,-300); resizeTo(0,0)</script>"+HTASettings+"<object id="+ID+" classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object>\"",
ShellWindows=(new ActiveXObject("Shell.Application")).Windows(),
NumberOfWindows = ShellWindows.Count;
(new ActiveXObject("WScript.Shell")).Run("mshta.exe javascript:"+CodeForLinking);
while (NumberOfWindows==ShellWindows.Count) {WScript.Sleep(10);}
for (var i=ShellWindows.Count; --i>=0;)
if (ShellWindows.Item(i).id == ID)
window = ShellWindows.Item(i).parent.parentWindow;
try
{
window.document.open();
window.document.write("<base href='http://localhost:"+Port+"/' >"+(content || "") + "<script language='JScript'>eval</script>");
window.document.close();
window.Host = Host;
window.moveTo(Number(x) || 0, Number(y) || 0);
window.resizeTo(Number(width) || 400, Number(height) || 300);
}
catch (e) {return}
return window;
}
function MainSocket_ConnectionRequest(requestID)
{
var NewSocket = WScript.CreateObject("MSWinsock.Winsock","Socket_");
NewSocket.Accept(requestID);
Sockets[NewSocket.SocketHandle]=NewSocket;
}
function Socket_SendComplete()
{
delete Sockets[this.SocketHandle];
this.Close();
WScript.DisconnectObject(this);
}
function Socket_DataArrival(bytTotal)
{
var Data = VB.GetData (this, Data, 8, bytTotal);
var FileName = HTTPGetFileName(Data);
if (Resources.GetResource(FileName))
{
this.SendData("HTTP/1.1 200 OK\nContent-Type: application/octet\nContent-Transfer-Encoding: binary\nContent-Disposition: inline\n\n");
this.SendData(DecodeBase64(Resources.GetResource(FileName)));
}
else this.SendData("HTTP/1.1 404 Not Found");
}
//——————————————————————————————————————————
function Resources()
{
/*[pic[iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADYUExURWJiYv7xQ0ZGRioqKiQaAP/te//gAPeiAP7uZP7lAP/YAPz8Ef/UAP31Kv+zAP7qADcuFf+6APOgAP3yAP/dAP33AP/MAP/VZemdAP3yAf+sAP/eQsaHAP7sEf30Ef/gY//DIP/VVtaeLkM9If7MYv31Jv/jVv/AEf7tKt6jMeCpAOXNJ/GfAP/BAPz5AOfQOf7jGfikAP/dAf/he/33Af7kEf/FKv/aEf/IRv/FPv7lAv7xYv/WCv/jDvixKuSkGfW5Rf7qAuOgDvmqEf/cKuKbAAAAAP///7GsR/gAAABIdFJOU///////////////////////////////////////////////////////////////////////////////////////////////AJzs8mAAAACwSURBVHjaVM9FFsMwDARQBxpmhqbMzMytlfvfqHbSTedpob/SCOU0QFNsiKqd9urNowWlYS5VSNbhEKhhLJ0RkhAKOy0gthiGYVky6eFh5QgWA13nODKf3e0OCK5ZTVXVWrbd998vYsHs+jPfNQWtIWJiT4aN65qyd4EJtSLIEMfP0wqSiDjnFU8o+hkO5un9UaApWjA1RFyFoh+2bdtIHMqyP78UnQjzv/5//30FGACrUSaRymhFqgAAAABJRU5ErkJggg==]]*/
/*[HTML[
<html><title>Гипертекстовое приложение</title><body>Привет от JSman! <img src='pic' /></body></html>
]]*/
}
var window = CreateWindow(Resources.GetResource("HTML"), 200, 200, 350, 100);
while ((typeof window.document)=="object") WScript.Sleep(10);
Полное описание работы частей скрипта можно найти в темах:
JScript: Создание окна, а также трансляция WScript в HTA
JS: Хранение ресурсов в файле JS.
VBScript: Обмен данными между процессами через сокеты.
Все, что написано выше разделителя в коде,
//——————————————————————————————————————————
является «модулем», то есть подлежит copy-paste.
Остальная часть (которая ниже разделителя) — это основной код.
function Resources()
{
/*[pic[base64рисунка]]*/
/*[HTML[
HTML код окна
]]*/
}
var window = CreateWindow(Resources.GetResource("HTML"), 200, 200, 350, 100);
while ((typeof window.document)=="object") WScript.Sleep(10);
Ресурсы лежат в контейнере Resources.