1 (изменено: Poltergeyst, 2016-02-01 22:51:40)

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

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

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

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

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


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

Option Explicit

Dim oScrSvc, oScrObj, oShell, oStream
Dim sF, sFile, sStr, sH
Dim iLen

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

sF = WScript.ScriptFullName
sFile = Left(sF, InStrRev(sF, "\")) & "windows.txt"

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

' Перебор окон, назначение функции обратного вызова
'--------------------------------------------------------------
iLen = 32
sStr = String(iLen,Chr(32))

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

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

Set oStream = Nothing
Set oShell = Nothing
Set oScrSvc = Nothing
Set oScrObj = Nothing

WScript.Quit()

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

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

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

End Function

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


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

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()

Подробнее см. readme в прикрепленном архиве.

Примеры использования библиотеки см. в прикрепленном архиве.

Post's attachments

scrsvc122.zip 54.34 kb, 13 downloads since 2016-02-01 

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

2 (изменено: Poltergeyst, 2016-01-29 22:27:36)

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

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

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

Вариант на VBScript:


' Вывод списка окон в диалог множественного выбора 
' VBScript
' WinXp

Option Explicit

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

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

' Перебор окон, назначение функции обратного вызова
'--------------------------------------------------------------
iLen = 32
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)
		
	j = j + 1
	ReDim Preserve arr(j)

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

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

Вариант на JScript:


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

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

var cnt = 0;
var lSlen = 32; 
var vPtr = oScrSvc.struct_setval(AllocStr(lSlen));
var s = new String('Выбранные значения: \n\r');
var sHwnd;
var lRes;

// Перебор окон, назначение функции обратного вызова
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 (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)
	}
	

	sHwnd = Number(hwnd).toString(16);
	for (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, 2016-01-25 22:24:55)

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

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

JScript:


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

 var oScrObj = new ActiveXObject('Scripting.FileSystemObject');
 var oScrSvc = new ActiveXObject('ScriptService.Service');
 var oShell = new ActiveXObject('WScript.Shell');

 var sHwnd;
 var i,j;
 var stb;

 sF = String(WScript.ScriptFullName);
 var sFile = sF.substring(0,sF.lastIndexOf('\\')+1)+'windows.txt';
 var oStream = oScrObj.OpenTextFile(sFile, 2, true, 0); 
 oStream.WriteLine('     HWND\tClass Name'); 

 var lSlen = 32; 
 var vPtr = AllocStruct(lSlen);

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

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

 oShell.Run('notepad '+sFile, 1, false);

 oStream.Close();
 oShell = null;
 oScrSvc = null;
 oScrObj = 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)
	}

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

	//-------------------------
	if (lParam==0)
	{
		j = 0;
		oStream.WriteLine('-------------------------------------------');
		stb='';
	}
	else if (lParam==1)
	{
		j++;
		stb = '\t';
	}

	//-------------------------
	if (j==1)
	{
		oStream.WriteLine('\r\n\t[child windows]');
	}
	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);
	}
	
	
}

//
// Выделение области памяти под структуру строкой заданной длины с возвратом указателя
//
//---------------------------------------------------------- 
function AllocStruct(lStructLen)
{
	var pStruct = '\0';
	for (i=0;i<lStructLen-1;i++)
	pStruct = pStruct + '\0';
	return oScrSvc.struct_setval(pStruct);
}

4 (изменено: Poltergeyst, 2016-01-25 22:53:42)

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

 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()