<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSH & Win32API: Библиотека scrsvc.dll]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=8082</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8082&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSH & Win32API: Библиотека scrsvc.dll».]]></description>
		<lastBuildDate>Mon, 25 Jan 2016 18:31:19 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: WSH & Win32API: Библиотека scrsvc.dll]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=100661#p100661</link>
			<description><![CDATA[<p>В версию 1.2.2 добавлен метод создания COM Automation объекта из незарегистрированной в реестре библиотеки.</p><p>Например, в библиотеке AutoItX3, класс [AutoItX3 Class], содержит Automation <br />интерфейс [IAutoItX3 Interface]. </p><p>&nbsp; Класс имеет идентификатор: <br />&nbsp; {1A671297-FA74-4422-80FA-6C5D8CE4DE04}, <br />&nbsp; а идентификатор интерфейса: <br />&nbsp; {3D54C6B8-D283-40E0-8FAB-C97F05947EE8}. </p><p>С помощью этих двух идентификаторов и пути к библиотеке можно получить объект [AutoItX3.Control].</p><p><strong>VBScript:</strong><br /></p><div class="codebox"><pre><code>
&#039; Создание COM Automation объекта из незарегистрированной в реестре COM библиотеки
&#039; с помощью объекта ScriptService.Service в VBScript
&#039; WinXP/7

 Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

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

 MsgBox TypeName(oAU3),vbSystemModal + vbInformation, &quot;Reply&quot;
 oAU3.ToolTip vbCRLF &amp; &quot;Создание Automation объекта без регистрации библиотеки...&quot; &amp; vbCRLF, 100, 100
 oAU3.Sleep(4000)
 WScript.Quit()
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Mon, 25 Jan 2016 18:31:19 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=100661#p100661</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH & Win32API: Библиотека scrsvc.dll]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=99596#p99596</link>
			<description><![CDATA[<p>Можно отобразить иерархию окон в системе (родительские вместе с дочерними) при помощи одного и того же callback, вызываемого рекурсивно и работающего в разных контекстах.</p><p><strong>JScript:</strong><br /></p><div class="codebox"><pre><code>
// Отображение частичной иерархии окон в системе(родительские вместе с дочерними 1 уровня) 
// с помощью объекта ScriptService.Service в JScript.
// (Используется один и тот же proxy-callback, назначаемый рекурсивно.)
// WinXP/7

 var oScrSvc = new ActiveXObject(&#039;ScriptService.Service&#039;);

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

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

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

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

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

 new ActiveXObject(&#039;WScript.Shell&#039;).Run(&#039;notepad&#039;+String.fromCharCode(32)+&#039;&quot;&#039;+sFile+&#039;&quot;&#039;, 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 (&#039;USER32.DLL&#039;,&#039;GetClassNameW&#039;,3, 1)
	}

	//-------------------------
	var sHwnd = Number(hwnd).toString(16);
	for (var i=0;i&lt;8-sHwnd.length;i++)
	sHwnd = &#039;0&#039;+sHwnd;

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

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

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

//
// Выделение строки заданной длины
//
//---------------------------------------------------------- 
function AllocStr(lStrLen)
{
	var sStr = &#039;\0&#039;;
	for (i=0;i&lt;lStrLen-1;i++)
	sStr = sStr + &#039;\0&#039;;
	return sStr;
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Wed, 09 Dec 2015 17:48:19 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=99596#p99596</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH & Win32API: Библиотека scrsvc.dll]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=85953#p85953</link>
			<description><![CDATA[<p>Еще пара сценариев для scrsvc.dll (v1.2)(v1.2.1)(v1.2.2), которые можно использовать в качестве заготовок для новых скриптов.</p><p>Сценарий перебирает текущие окна в системе и выводит их дескрипторы и названия классов в диалог множественного выбора.</p><p>Вариант на <strong>VBScript</strong>:<br /></p><div class="codebox"><pre><code>
&#039; Вывод списка окон в диалог множественного выбора 
&#039; Win XP/7

Option Explicit

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

&#039; Создание объекта
&#039;--------------------------------------------------------------
Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

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

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

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

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

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

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

&#039; Функция обратного вызова
&#039;--------------------------------------------------------------
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 &quot;USER32.DLL&quot;,&quot;GetClassNameW&quot;,3,1
	End With

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

	j = j + 1
		
End Function
</code></pre></div><p>Вариант на <strong>JScript</strong>:<br /></p><div class="codebox"><pre><code>
// Вывод списка окон в диалог множественного выбора 
// WinXP/7

var oScrSvc = new ActiveXObject(&#039;ScriptService.Service&#039;);
var oDict = new ActiveXObject(&#039;Scripting.Dictionary&#039;);

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

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

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

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

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

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

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

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 (&#039;USER32.DLL&#039;,&#039;GetClassNameW&#039;,3,1);
	}
	

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


//
// Выделение строки заданной длины
//
//---------------------------------------------------------- 
function AllocStr(lStrLen)
{
	var sStr = &#039;\0&#039;;
	for (i=0;i&lt;lStrLen-1;i++)
	sStr = sStr + &#039;\0&#039;;
	return sStr;
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 17 Aug 2014 17:00:54 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=85953#p85953</guid>
		</item>
		<item>
			<title><![CDATA[WSH & Win32API: Библиотека scrsvc.dll]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=69514#p69514</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>v1.2.2.1 (текущая актуальная версия)</p><p>Библиотека scrsvc.dll предназначена для вызова stdcall/cdecl WinAPI функций в сценариях VBScript и JScript, а также для отображения диалога множественного выбора и предоставляет объект ScriptService.Service.</p><p>Тестировалась на Win7 x32</p><p>1) Пример использования на <strong>VBScript</strong> (перечисление окон в системе):<br /></p><div class="codebox"><pre><code>
&#039; Перебор окон с помощью объекта ScriptService.Service в VBScript
&#039; WinXP/7

Option Explicit

Dim oScrSvc, oStream
Dim sFile, sStr
Dim iLen

&#039; Создание объектов
&#039;--------------------------------------------------------------
Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

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

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

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

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

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

WScript.Quit()

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

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

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

End Function

&#039; Путь к файлу вывода
&#039;--------------------------------------------------------------	
Function GetFilePath()
	Dim sF
	sF = WScript.ScriptFullName
	GetFilePath = Left(sF, InStrRev(sF, &quot;\&quot;)) &amp; &quot;windows.txt&quot;
End Function
</code></pre></div><p>2) Пример использования на <strong>VBScript</strong> (отображение диалога множественного выбора):<br /></p><div class="codebox"><pre><code>
&#039; Диалог множественного выбора в VBScript
&#039; WinXP/7

Option Explicit

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

&#039; Создание объекта
&#039;--------------------------------------------------------------
Set oScrSvc = CreateObject(&quot;ScriptService.Service&quot;)

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

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

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

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

MsgBox s, vbSystemModal Or vbInformation, &quot;Reply&quot;
&#039;--------------------------------------------------------------
Set oScrSvc = Nothing
WScript.Quit()
</code></pre></div><p>Cкачать <a href="https://my-files.ru/5flr9v">scrsvc.dll(v1.2.2.1) + примеры</a> с файлообменника.</p><p>Справку readme, а также примеры использования см. в архиве библиотеки.</p>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Thu, 14 Feb 2013 21:37:27 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=69514#p69514</guid>
		</item>
	</channel>
</rss>
