Тема: WSC: Script Component для чтения ресурсов из файлов через res протокол
Решил эту затею в отдельную тему вынести. Вдруг кому пригодится. А если повезёт, то может кто и допилит дальше.
Пересобрал код в виде WSC resReader.wsc.
Компонент содержит методы:
Open - открытие ресурса (всего лишь принимает имя файла)
GetStrings - чтение строковой таблицы по ID
GetString - чтение строки по ID
GetIcon - чтение содержимого иконки
GetBitmap - чтение содержимого рисунка
Пример работы с компонентом:
/* Restart in CScript */
if(WScript.FullName.match(/CScript/gi) == null){
new ActiveXObject("WScript.Shell").Run("cscript \"" + WScript.ScriptFullName + "\"")
WScript.Quit();
}
var StdOut = WScript.StdOut
var StdIn = WScript.StdIn
with (GetObject("script:file:resReader.wsc")){
/* Opening file */
Open("shell32.dll")
StdOut.WriteLine("1) Loading STRINGTABLE 337 from from \"shell32.dll\"\r\n")
/* Reading STRINGTABLE resource */
var Strings = GetStrings(337)
StdOut.WriteLine("String table 337 contains " + Strings.Count + " strings\r\n")
/* Building STRINGTABLE visualisation */
var arr = [], item
for(var i=0;i < Strings.Count;i++){
item = Strings.Item(i)
arr.push(item.id + ", \"" + String(item).replace(/\"/g,"\\\"") + "\"")
}
StdOut.WriteLine("{\r\n" + arr.join("\r\n") + "\r\n}\r\n")
StdOut.WriteLine("2) Input id resource for checking")
/* Сheck the existence of the resource */
var id = StdIn.ReadLine()
if(Strings.Exists(id)){
StdOut.WriteLine("Resource \"" + id + "\" found in string table\r\n")
StdOut.WriteLine("It's value is \"" + Strings.ItemByID(id) + "\"\r\n")
} else {
StdOut.WriteLine("Resource \"" + id + "\" not found in string table\r\n")
}
/* Loading icon resource */
StdOut.WriteLine("3) Loading ICON resource 203... \r\n")
with(new ActiveXObject("ADODB.Stream")){
Type = 1;
Open();
Write(GetIcon(203));
SaveToFile("testImage.png", 2);
}
StdOut.WriteLine("Press ENTER key to show the image...")
StdIn.ReadLine();
new ActiveXObject("WScript.Shell").Run("testImage.png");
}