1 (изменено: Poltergeyst, 2019-05-31 20:16:16)

Тема: WSH & Win32API: Библиотека scrsvc.dll

Без гарантий. Используете на свой страх и риск.

v1.2.2.1 (текущая актуальная версия)

Библиотека scrsvc.dll предназначена для вызова stdcall/cdecl WinAPI функций в сценариях VBScript и JScript, а также для отображения диалога множественного выбора и предоставляет объект ScriptService.Service.

Тестировалась на Win7 x32

1) Пример использования на VBScript (перечисление окон в системе):


' Перебор окон с помощью объекта ScriptService.Service в VBScript
' WinXP/7

Option Explicit

Dim oScrSvc, oStream
Dim sFile, sStr
Dim iLen

' Создание объектов
'--------------------------------------------------------------
Set oScrSvc = CreateObject("ScriptService.Service")

iLen = 255
sStr = String(iLen,Chr(32))

sFile = GetFilePath()
Set oStream = CreateObject("Scripting.FileSystemObject").OpenTextFile(sFile, 2, True, 0)
oStream.WriteLine String(6,Chr(32)) & "HWND" & vbTab & "Class Name" 

' Перебор окон, назначение функции обратного вызова
'--------------------------------------------------------------
With oScrSvc
	.set_vararg 0, oScrSvc.internal_callback(Me, "EnumClbck",2)
	.set_vararg 1, 0
	.api_call "USER32.DLL","EnumWindows",2
End With

oStream.Close()
Set oStream = Nothing
Set oScrSvc = Nothing

' Отображение результата
'--------------------------------------------------------------
CreateObject("WScript.Shell").Run "notepad" & Chr(32) & """" & sFile & """", 1, False

WScript.Quit()

' Функция обратного вызова
'--------------------------------------------------------------	
Function EnumClbck(hwnd, lParam)

	Dim sH
	With oScrSvc
		.set_vararg 0, CDbl(hwnd)
		.set_strarg 1, sStr, True
		.set_vararg 2, ilen
		.api_call "USER32.DLL","GetClassNameW",3,1
	End With

	' Заполнение файла полученными данными
	sH = Hex(hwnd)
	oStream.WriteLine "0x" & String(8-Len(sH),"0") & sH & vbTab & oScrSvc.pull_string(sStr,True)

End Function

' Путь к файлу вывода
'--------------------------------------------------------------	
Function GetFilePath()
	Dim sF
	sF = WScript.ScriptFullName
	GetFilePath = Left(sF, InStrRev(sF, "\")) & "windows.txt"
End Function

2) Пример использования на VBScript (отображение диалога множественного выбора):


' Диалог множественного выбора в VBScript
' WinXP/7

Option Explicit

Dim oScrSvc
Dim arr(50)
Dim arrRet
Dim i
Dim s

' Создание объекта
'--------------------------------------------------------------
Set oScrSvc = CreateObject("ScriptService.Service")

s = "Выбранные значения: " & vbCRLF

' Заполнить массив значениями  
For i=0 To 49
	arr(i)="значение_" & i
Next

' Вызвать диалог
arrRet = oScrSvc.multi_dialog(arr)

' Разобрать выбранные значения
For i=0 To UBound(arrRet)
	s = s &  arrRet(i) & vbCRLF
Next

MsgBox s, vbSystemModal Or vbInformation, "Reply"
'--------------------------------------------------------------
Set oScrSvc = Nothing
WScript.Quit()

Cкачать scrsvc.dll(v1.2.2.1) + примеры с файлообменника.

Справку readme, а также примеры использования см. в архиве библиотеки.

Post's attachments

scrsvc1221.zip 58.2 kb, 4 downloads since 2019-05-31 

You don't have the permssions to download the attachments of this post.

2 (изменено: Poltergeyst, 2019-05-12 23:37:32)

Re: WSH & Win32API: Библиотека scrsvc.dll

Еще пара сценариев для scrsvc.dll (v1.2)(v1.2.1)(v1.2.2), которые можно использовать в качестве заготовок для новых скриптов.

Сценарий перебирает текущие окна в системе и выводит их дескрипторы и названия классов в диалог множественного выбора.

Вариант на VBScript:


' Вывод списка окон в диалог множественного выбора 
' Win XP/7

Option Explicit

Dim arr()
Dim arrRet
Dim oScrSvc
Dim iLen, i, j
Dim sStr,s 

' Создание объекта
'--------------------------------------------------------------
Set oScrSvc = CreateObject("ScriptService.Service")

iLen = 255
sStr = String(iLen,Chr(32))

' Перебор окон, назначение функции обратного вызова
'--------------------------------------------------------------
j = 0

With oScrSvc
	.set_vararg 0, oScrSvc.internal_callback(Me, "EnumClbck",2)
	.set_vararg 1, 0
	.api_call "USER32.DLL","EnumWindows",2
End With

' Вызвать диалог
'--------------------------------------------------------------
arrRet = oScrSvc.multi_dialog(arr)

' Разобрать выбранные значения
'--------------------------------------------------------------
For i = 0 To UBound(arrRet)
	s = s &  arrRet(i) & vbCRLF
Next

WScript.Echo s
Set oScrSvc = Nothing
WScript.Quit()

' Функция обратного вызова
'--------------------------------------------------------------
Function EnumClbck(hwnd, lParam)
		
	Dim sH
	ReDim Preserve arr(j+1)

	With oScrSvc
		.set_vararg 0, CDbl(hwnd)
		.set_strarg 1, sStr, True
		.set_vararg 2, iLen
		.api_call "USER32.DLL","GetClassNameW",3,1
	End With

	sH = Hex(hwnd)
	arr(j) = CStr("0x" & String(8-Len(sH),"0") & sH & Chr(32) & oScrSvc.pull_string(sStr,True))

	j = j + 1
		
End Function

Вариант на JScript:


// Вывод списка окон в диалог множественного выбора 
// WinXP/7

var oScrSvc = new ActiveXObject('ScriptService.Service');
var oDict = new ActiveXObject('Scripting.Dictionary');

var cnt = 0;
var s = new String('Выбранные значения: \n\r');

var lSlen = 255; 
var vPtr = oScrSvc.struct_setval(AllocStr(lSlen));

// Перебор окон, назначение функции обратного вызова
with (oScrSvc)
{

	set_vararg(0, oScrSvc.internal_callback(this, 'EnumClbck',2));
	set_vararg(1, 0);
	api_call('USER32.DLL','EnumWindows',2);
}

// Преобразовать заполненную коллекцию в VBArray
var arr = VBArray(oDict.items());

// Вызвать диалог
var arrRet = oScrSvc.multi_dialog(arr).toArray();

// Разобрать полученные значения
for (var i=0; i<arrRet.length; i++) 
{
	s = s + String(arrRet[i])+'\n\r'; 
};

WScript.Echo(s);
oDict = null;
oScrSvc = null;
WScript.Quit();

// Функция обратного вызова
// --------------------------------------------------------------
function EnumClbck(hwnd, lParam)
{
	
	with (oScrSvc)
	{
		set_vararg(0, hwnd);
		set_vararg(1, vPtr);
		set_vararg(2, lSlen);
		lRes = api_call ('USER32.DLL','GetClassNameW',3,1);
	}
	

	var sHwnd = Number(hwnd).toString(16);
	for (var i=0;i<8-sHwnd.length;i++)
	sHwnd = '0'+sHwnd;
	
	oDict.Add(cnt, String('0x'+sHwnd) + String.fromCharCode(32) + oScrSvc.pull_string(vPtr,true)); 
	cnt++;
}


//
// Выделение строки заданной длины
//
//---------------------------------------------------------- 
function AllocStr(lStrLen)
{
	var sStr = '\0';
	for (i=0;i<lStrLen-1;i++)
	sStr = sStr + '\0';
	return sStr;
}

3 (изменено: Poltergeyst, 2019-05-13 00:50:29)

Re: WSH & Win32API: Библиотека scrsvc.dll

Можно отобразить иерархию окон в системе (родительские вместе с дочерними) при помощи одного и того же callback, вызываемого рекурсивно и работающего в разных контекстах.

JScript:


// Отображение частичной иерархии окон в системе(родительские вместе с дочерними 1 уровня) 
// с помощью объекта ScriptService.Service в JScript.
// (Используется один и тот же proxy-callback, назначаемый рекурсивно.)
// WinXP/7

 var oScrSvc = new ActiveXObject('ScriptService.Service');

 var stb;
 var flg = false;
 
 var lSlen = 255; 
 var vPtr = oScrSvc.struct_setval(AllocStr(lSlen));

 var sFile = getFilePath();
 var oStream = new ActiveXObject('Scripting.FileSystemObject').OpenTextFile(sFile, 2, true, 0); 
 oStream.WriteLine(''); 
 oStream.WriteLine('HWND\t\tClass Name'); 

 
// Старт перебора окон, назначение функции обратного вызова
// --------------------------------------------------------------
 with (oScrSvc)
 {

	set_vararg(0, oScrSvc.internal_callback(this, 'EnumClbck',2));
	set_vararg(1, 0);
	api_call('USER32.DLL','EnumWindows',2);
 }

 oStream.Close();
 oStream = null;
 oScrSvc = null;

 new ActiveXObject('WScript.Shell').Run('notepad'+String.fromCharCode(32)+'"'+sFile+'"', 1, false);

 WScript.Quit()

//
// Функция обратного вызова
//
// --------------------------------------------------------------
function EnumClbck(hwnd, lParam)
{
		
	// Сделать запись в файл
	//-----------------------------------------------------
	with (oScrSvc)
	{
		set_vararg(0, hwnd)
		set_vararg(1, vPtr)
		set_vararg(2, lSlen)
		lRes = api_call ('USER32.DLL','GetClassNameW',3, 1)
	}

	//-------------------------
	var sHwnd = Number(hwnd).toString(16);
	for (var i=0;i<8-sHwnd.length;i++)
	sHwnd = '0'+sHwnd;

	//-------------------------
	if (lParam==0)
	{
		flg = false;
		oStream.WriteLine('-------------------------------------------');
		stb='';
	}
	else if (lParam==1)
	{
		if (flg==false)
		{
			oStream.WriteLine('\r\n\t[child windows]');
			stb = '\t';
			flg = true;
		}
		
		
	}
	oStream.WriteLine(stb + String('0x'+sHwnd) + stb + '\t' + oScrSvc.pull_string(vPtr,true)); 
	
	// Перебор дочерних окон, рекурсивный callback
	//-----------------------------------------------------
	lParam++;
	if (lParam==2){return;}

	with (oScrSvc)
	{
		set_vararg(0, hwnd);
		set_vararg(1, oScrSvc.internal_callback(this, 'EnumClbck',2));
		set_vararg(2, lParam);
		api_call('USER32.DLL','EnumChildWindows',3, 2);
	}
	
	
}

//
// Путь к файлу вывода
//
//---------------------------------------------------------- 
function getFilePath()
{
	var sF = WScript.ScriptFullName;
	return sF.substring(0,sF.lastIndexOf('\\')+1)+'windows.txt';
}

//
// Выделение строки заданной длины
//
//---------------------------------------------------------- 
function AllocStr(lStrLen)
{
	var sStr = '\0';
	for (i=0;i<lStrLen-1;i++)
	sStr = sStr + '\0';
	return sStr;
}

4 (изменено: Poltergeyst, 2019-04-16 00:59:15)

Re: WSH & Win32API: Библиотека scrsvc.dll

В версию 1.2.2 добавлен метод создания COM Automation объекта из незарегистрированной в реестре библиотеки.

Например, в библиотеке AutoItX3, класс [AutoItX3 Class], содержит Automation
интерфейс [IAutoItX3 Interface].

  Класс имеет идентификатор:
  {1A671297-FA74-4422-80FA-6C5D8CE4DE04},
  а идентификатор интерфейса:
  {3D54C6B8-D283-40E0-8FAB-C97F05947EE8}.

С помощью этих двух идентификаторов и пути к библиотеке можно получить объект [AutoItX3.Control].

VBScript:


' Создание COM Automation объекта из незарегистрированной в реестре COM библиотеки
' с помощью объекта ScriptService.Service в VBScript
' WinXP/7

 Set oScrSvc = CreateObject("ScriptService.Service")

 ' [AutoItX3.Control]
 Set oAU3 = oScrSvc.create_obj_dll("G:\AutoItX3.dll", _
				"{1A671297-FA74-4422-80FA-6C5D8CE4DE04}", _
				"{3D54C6B8-D283-40E0-8FAB-C97F05947EE8}")

 MsgBox TypeName(oAU3),vbSystemModal + vbInformation, "Reply"
 oAU3.ToolTip vbCRLF & "Создание Automation объекта без регистрации библиотеки..." & vbCRLF, 100, 100
 oAU3.Sleep(4000)
 WScript.Quit()