<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; WSH & HTA: обмен данными между скрипт-процессами]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=1648&amp;type=atom" />
	<updated>2009-08-25T10:44:30Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=1648</id>
		<entry>
			<title type="html"><![CDATA[Re: WSH & HTA: обмен данными между скрипт-процессами]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=27491#p27491" />
			<content type="html"><![CDATA[<p>Обмен данными между скриптами можно реализовать через сокеты. Для работы примера понадобится зарегистрированный «mswinsck.ocx» (поставляется вместе с MS Office, VB6). </p><p>В примере показан обмен данными между двумя скриптами. Одним из них является сервер [Server.vbs], другой — клиент [Client.vbs]. Сначала запустите «сервер», затем — «клиента».</p><p>[Server.vbs]<br /></p><div class="codebox"><pre><code>Dim Winsock
Set Winsock = WScript.CreateObject(&quot;MSWinsock.Winsock&quot;)

Dim bClose
  bClose = True

Sub Winsock_ConnectionRequest(reqId)
  Winsock.Close()
  Winsock.Accept(reqId)
End Sub

Sub Winsock_DataArrival(bytTotal)
Dim Data
  Data = &quot;&quot;
  Winsock.GetData Data, 8, bytTotal
  WScript.Echo(&quot;[Сервер] Получено: &quot;+Data)
  Winsock.SendData(&quot;Привет от сервера :) &quot;)
End Sub

Sub Winsock_Error (number, desc, sCode, src, help, helpctx, cancelDisplay)
  WScript.Echo(&quot;[Сервер] Ошибка: &quot;+desc)
  bClose = False
End Sub

Sub Winsock_Close
  &#039;WScript.Echo(&quot;Соединение закрыто.&quot;)
  bClose=False
End Sub

  WScript.ConnectObject Winsock,&quot;Winsock_&quot;
   
  Winsock.LocalPort = 6789
  Winsock.Protocol = 0
  Winsock.Listen
   
  Do While (bClose) 
  WScript.Sleep(500)
  Loop</code></pre></div><p>[Client.vbs]<br /></p><div class="codebox"><pre><code>   
Dim bConnected
Dim bSent
  bConnected=false
  bSent=false

Dim bDataReceived
  bDataReceived=false

Dim Winsock
Set Winsock=WScript.CreateObject(&quot;MSWinsock.Winsock&quot;)

Sub Winsock_Connect
  bConnected=true
End Sub

Sub Winsock_SendComplete
  bSent=true
End Sub

Sub Winsock_DataArrival(bytTotal)
Dim str
  Winsock.GetData str,8
  WScript.Echo &quot;[Клиент] Получено: &quot; &amp; str
  bDataReceived=true
End Sub

  WScript.ConnectObject Winsock,&quot;Winsock_&quot;
  Winsock.Connect &quot;127.0.0.1&quot;, 6789
  Do While Not (bConnected)
  WScript.Sleep 500
  Loop
   
  Winsock.SendData &quot;Привет, сервер!&quot;
   
  Do While Not(bDataReceived)
  WScript.Sleep 500
  Loop
  Winsock.Close</code></pre></div><p>Полную документацию по Winsock Control можно найти <a href="http://msdn.microsoft.com/en-us/library/aa228119(VS.60).aspx">тут</a>.</p>]]></content>
			<author>
				<name><![CDATA[JSmаn]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24434</uri>
			</author>
			<updated>2009-08-25T10:44:30Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=27491#p27491</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH & HTA: обмен данными между скрипт-процессами]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=12283#p12283" />
			<content type="html"><![CDATA[<p>Именованная разделяемая область памяти способна работать не только в качестве сигнализатора, но и в качестве буфера чтения-записи со стороны разных скриптовых процессов.<br />Потребуются библиотеки <a href="http://www.script-coding.com/LangMF.html">LangMF.Dll</a> и <a href="http://www.script-coding.com/dynwrap.html">dynwrap.dll</a>.<br />Скрипт-сервер <strong>MAPSVR.js</strong> создает разделяемую область памяти и заполняет её данными, введёнными через InputBox.<br /></p><div class="codebox"><pre><code>//------------------------------------------------------------------
//Скрипт-сервер,создает разделяемую область памяти
//и заполняет её данными
//------------------------------------------------------------------
//Lang.JScript
//Потребуются библиотеки [dynwrap.dll] и [LangMf.dll v7.7.0.0]
//ОС Win98/Millenium
//------------------------------------------------------------------
//Константы CreateFileMapping/
var PAGE_READONLY         =2
var PAGE_READWRITE         =4
var PAGE_WRITECOPY         =8
var PAGE_EXECUTE         =16
var PAGE_EXECUTE_READ     =32
var SEC_IMAGE            =eval(&#039;0x1000000&#039;)
//------------------------------------------------------------------
//Константы MapViewOfFile/
var FILE_MAP_WRITE=2
var FILE_MAP_ALL_ACCESS     = 0xf001f
var FILE_MAP_READ         =4
//------------------------------------------------------------------

//Вставка кода LangMf
LMFCode= 
&#039;&lt;#Module=shareServer&gt;                     \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;Sub Load(cmdstr)                        \n&#039;+
&#039;End Sub                            \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;Function InputStrPtr()                        \n&#039;+
&#039;    strData=InputBox(&quot;Введите данные:&quot;,&quot;Скрипт-сервер&quot;)    \n&#039;+
&#039;    If strData=&quot;&quot; Then                    \n&#039;+
&#039;        InputStrPtr=0                    \n&#039;+
&#039;        Exit Function                    \n&#039;+
&#039;    End If                            \n&#039;+
&#039;InputStrPtr=Sys.cStrPtr(strData &amp; String(255-Len(strData),Chr(32)))\n&#039;+
&#039;End Function                            \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;Function WaitMessage()                        \n&#039;+
&#039;MsgBox &quot;Не закрывая это сообщение,запустите скрипт-клиент.&quot;, _    \n&#039;+
&#039;    vbExclamation+vbSystemModal, _            \n&#039;+
&#039;    &quot;Скрипт сервер&quot;                    \n&#039;+
&#039;End Function                            \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;&lt;#Module&gt;&#039;
    
    LMFCode=LMFCode.replace(/(;)+/igm,&quot;&#039;&quot;)
    var LMF    =new ActiveXObject(&quot;Atomix.LangMF&quot;)
    LMF.Command(LMFCode)

//[Выделение разделяемой именованной области памяти]
//------------------------------------------------------------------
    WScript.Sleep(100)
CreateFileMappingAC=new ActiveXObject(&quot;DynamicWrapper&quot;)
CreateFileMappingAC.Register(
    &quot;KERNEL32.DLL&quot;,&quot;CreateFileMappingA&quot;,&quot;i=hlllls&quot;,&quot;f=s&quot;,&quot;r=h&quot;)

hMap=CreateFileMappingAC.CreateFileMappingA(    
            -1,
            0,
            PAGE_READWRITE,
            0,
            4096,
            &quot;scriptmap&quot;)    

//[Мэппирование выделенной области]
//------------------------------------------------------------------
    WScript.Sleep(100)
MapViewOfFileC=new ActiveXObject(&quot;DynamicWrapper&quot;)
MapViewOfFileC.Register(
    &quot;KERNEL32.DLL&quot;,&quot;MapViewOfFile&quot;,&quot;i=hllll&quot;,&quot;f=s&quot;,&quot;r=h&quot;)

hView=MapViewOfFileC.MapViewOfFile(
            hMap,
            FILE_MAP_WRITE,
            0,
            0,
            0)

//[Ввод строковых данных(не более 255 симв.)]
//[Получение соответствующего указателя]
//------------------------------------------------------------------
    WScript.Sleep(100)
    sPtr=LMF.FuncRun(&#039;InputStrPtr&#039;,1)
    WScript.Sleep(100)
    if (!sPtr){releaseMap();WScript.Quit(-1)}

//[Перемещение данных в разделяемую область памяти]
//------------------------------------------------------------------
var RtlMoveMemoryC=new ActiveXObject(&quot;DynamicWrapper&quot;)
RtlMoveMemoryC.Register(
    &quot;KERNEL32.DLL&quot;,&quot;RtlMoveMemory&quot;,&quot;i=lll&quot;,&quot;f=s&quot;,&quot;r=l&quot;)

hRes=RtlMoveMemoryC.RtlMoveMemory(hView,sPtr,255)

//------------------------------------------------------------------
    WScript.Sleep(100)
    LMF.FuncRun(&#039;WaitMessage&#039;,1)
    WScript.Sleep(100)
    releaseMap()
//------------------------------------------------------------------
//[Освобождение дескрипторов]
//------------------------------------------------------------------
function releaseMap()
{
    UnmapViewOfFileC=new ActiveXObject(&quot;DynamicWrapper&quot;)
    UnmapViewOfFileC.Register(
        &quot;KERNEL32.DLL&quot;,&quot;UnmapViewOfFile&quot;,&quot;i=h&quot;,&quot;f=s&quot;,&quot;r=l&quot;)

    UnmapViewOfFileC.UnmapViewOfFile(hView)
    //---------------------------------------------------------
    CloseHandleC=new ActiveXObject(&quot;DynamicWrapper&quot;)
    CloseHandleC.Register(
        &quot;KERNEL32.DLL&quot;,&quot;CloseHandle&quot;,&quot;i=h&quot;,&quot;f=s&quot;,&quot;r=l&quot;)

    CloseHandleC.CloseHandle(hMap)
    LMF.Reset()
    WScript.Quit()
}
//------------------------------------------------------------------
//Poltergeyst</code></pre></div><p>Скрипт-клиент <strong>MAPCLN.js</strong> открывает разделяемую область памяти и читает данные.<br /></p><div class="codebox"><pre><code>//------------------------------------------------------------------
//Скрипт-клиент,открывает разделяемую область памяти
//и читает данные.
//------------------------------------------------------------------
//Lang.JScript
//Потребуются библиотеки [dynwrap.dll] и [LangMf.dll v7.7.0.0]
//ОС Win98/Millenium
//------------------------------------------------------------------
//Константы CreateFileMapping/
var PAGE_READONLY         =2
var PAGE_READWRITE         =4
var PAGE_WRITECOPY         =8
var PAGE_EXECUTE         =16
var PAGE_EXECUTE_READ         =32
var SEC_IMAGE            =eval(&#039;0x1000000&#039;)
//------------------------------------------------------------------
//Константы MapViewOfFile/
var FILE_MAP_ALL_ACCESS     = 0xf001f
var FILE_MAP_READ         =4
var FILE_MAP_WRITE        =2
//------------------------------------------------------------------
var CP_ACP=0

//Вставка кода LangMf
LMFCode= 
&#039;&lt;#Module=shareClient&gt;                    \n&#039;+
&#039;Public strStr                            \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;Sub Load(cmdstr)                        \n&#039;+
&#039;End Sub                            \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;Function GetStrPtr()                        \n&#039;+
&#039;    strStr=String(255,Chr(32))                \n&#039;+
&#039;    GetStrPtr=Sys.cStrPtr(strStr)                \n&#039;+
&#039;End Function                            \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;Function GetStr()                        \n&#039;+
&#039;strStr=Sys.RTrimS(strStr)                    \n&#039;+
&#039;    MsgBox &quot;Принято сообщение: &quot; &amp; strStr, _        \n&#039;+
&#039;    vbInformation+vbSystemModal,&quot;Скрипт клиент&quot;        \n&#039;+
&#039;GetStr=strStr                            \n&#039;+
&#039;End Function                            \n&#039;+
&#039;;--------------------------------------------------------------\n&#039;+
&#039;&lt;#Module&gt;&#039;
    
    LMFCode=LMFCode.replace(/(;)+/igm,&quot;&#039;&quot;)
    var LMF    =new ActiveXObject(&quot;Atomix.LangMF&quot;)
    LMF.Command(LMFCode)

//[Открытие разделяемой области памяти]
//------------------------------------------------------------------
    WScript.Sleep(100)
CreateFileMappingAC=new ActiveXObject(&quot;DynamicWrapper&quot;)
CreateFileMappingAC.Register(
    &quot;KERNEL32.DLL&quot;,&quot;CreateFileMappingA&quot;,&quot;i=hlllls&quot;,&quot;f=s&quot;,&quot;r=h&quot;)

hShare=CreateFileMappingAC.CreateFileMappingA(    
            -1,
            0,
            PAGE_READWRITE,
            0,
            4096,
            &quot;scriptmap&quot;)    

//Если область уже создана скриптом сервером,то будет получен
//дескриптор этой,уже существующей области.
//[Мэппирование полученного участка памяти]
//------------------------------------------------------------------
    WScript.Sleep(100)
MapViewOfFileC=new ActiveXObject(&quot;DynamicWrapper&quot;)
MapViewOfFileC.Register(
    &quot;KERNEL32.DLL&quot;,&quot;MapViewOfFile&quot;,&quot;i=hllll&quot;,&quot;f=s&quot;,&quot;r=h&quot;)

hShareView=MapViewOfFileC.MapViewOfFile(    
        hShare,
        FILE_MAP_ALL_ACCESS,
        0,
        0,
        0)

//[Получение указателя на строку-болванку]
//------------------------------------------------------------------
    WScript.Sleep(100)
    sPtr=LMF.FuncRun(&#039;GetStrPtr&#039;,1)
    WScript.Sleep(100)

//[Копирование содержимого мэппированного участка в строку-болванку]
//------------------------------------------------------------------
var memcpyC    =new ActiveXObject(&quot;DynamicWrapper&quot;) 
memcpyC.Register(&quot;msvcrt.dll&quot;,&quot;memcpy&quot;,&quot;f=c&quot;,&quot;i=lll&quot;,&quot;r=l&quot;)
    WScript.Sleep(100)
    pDest=LMF.FuncRun(&quot;GetStrPtr&quot;,1)
    res=memcpyC.memcpy(pDest,hShareView,255) 

//[Возврат данных]
//------------------------------------------------------------------
    WScript.Sleep(100)
    strData=LMF.FuncRun(&#039;GetStr&#039;,1)
    WScript.Sleep(100)
    LMF.Reset()
    WScript.Quit()
//------------------------------------------------------------------
//Poltergeyst</code></pre></div><p>Сначала надо запустить скрипт-сервер, указать данные в поле ввода, и после появления сообщения о запуске скрипта-клиента, запустить<br />скрипт-клиент, который должен воспроизвести данные, оставленные сервером.<br />Проверялось на Win98/Me/XP.<br />Автор примеров - <strong>Poltergeyst</strong>, благодарность за разъяснения - <strong>YMP</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-07-07T11:44:12Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=12283#p12283</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH & HTA: обмен данными между скрипт-процессами]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=12207#p12207" />
			<content type="html"><![CDATA[<p>В качестве синхронизатора процессов может также выступать разделяемая именованная область памяти, создаваемая одним процессом с помощью CreateFileMapping, и открываемая другим с помощью OpenFileMapping.<br />Для запуска примеров потребуется библиотека <a href="http://www.script-coding.com/dynwrap.html">dynwrap.dll</a>.<br />Скрипт RUN.VBS ожидает появления разделяемой области:<br /></p><div class="codebox"><pre><code>&#039;---------------------------------------------------------------
&#039;Скрипт ожидает создания разделяемой области
&#039;памяти и закрывается при её появлении.
&#039;---------------------------------------------------------------
&#039;Lang. VBScript
&#039;OC Win98/Millenium
&#039;Используется библиотека dynwrap.dll
&#039;---------------------------------------------------------------
&#039;Константы CreateFileMapping/
Const PAGE_READONLY         =2
Const PAGE_READWRITE     =4
Const PAGE_WRITECOPY     =8
Const PAGE_EXECUTE         =16
Const PAGE_EXECUTE_READ     =32
Const SEC_IMAGE        =&amp;H1000000

Public hShare
hShare=0

MsgBox &quot;Скрипт RUN.VBS запущен&quot;,vbExclamation,&quot;RUN.VBS&quot;
&#039;---------------------------------------------------------------
&#039;Открытие разделяемой области памяти
Set OpenFileMappingAC=CreateObject(&quot;DynamicWrapper&quot;)
OpenFileMappingAC.Register _
&quot;KERNEL32.DLL&quot;,&quot;OpenFileMappingA&quot;,&quot;i=lls&quot;,&quot;f=s&quot;,&quot;r=h&quot;

&#039;---------------------------------------------------------------
While hShare=0
hShare=OpenFileMappingAC.OpenFileMappingA( _
        PAGE_READWRITE, _
        1, _
        &quot;scrmap&quot;)
WScript.Sleep(100)
Wend
&#039;---------------------------------------------------------------
WScript.Sleep(200)
MsgBox &quot;Скрипт RUN.VBS остановлен&quot;,vbExclamation,&quot;RUN.VBS&quot;
&#039;---------------------------------------------------------------
&#039;Закрытие дескриптора hMap
Set CloseHandleC=CreateObject(&quot;DynamicWrapper&quot;)
CloseHandleC.Register _
&quot;KERNEL32.DLL&quot;,&quot;CloseHandle&quot;,&quot;i=h&quot;,&quot;f=s&quot;,&quot;r=l&quot;
CloseHandleC.CloseHandle hShare 
&#039;---------------------------------------------------------------
Set OpenFileMappingAC=Nothing
Set CloseHandleC=Nothing</code></pre></div><p>Скрипт STOP.VBS создает именованную область и является &quot;тормозом&quot; предыдущего скрипта:<br /></p><div class="codebox"><pre><code>&#039;---------------------------------------------------------------
&#039;Скрипт создающий разделяемую область памяти с именем
&#039;SCRMAP.Создание такой области станет сигналом
&#039;для другого скрипта,который закроется при её появлении.
&#039;---------------------------------------------------------------
&#039;Lang. VBScript
&#039;OC Win98/Millenium
&#039;Используется библиотека dynwrap.dll
&#039;---------------------------------------------------------------
&#039;Константы CreateFileMapping/
Const PAGE_READONLY         =2
Const PAGE_READWRITE     =4
Const PAGE_WRITECOPY     =8
Const PAGE_EXECUTE         =16
Const PAGE_EXECUTE_READ     =32
Const SEC_IMAGE        =&amp;H1000000
&#039;---------------------------------------------------------------
Set CreateFileMappingAC=CreateObject(&quot;DynamicWrapper&quot;)
CreateFileMappingAC.Register _
&quot;KERNEL32.DLL&quot;,&quot;CreateFileMappingA&quot;,&quot;i=hlllls&quot;,&quot;f=s&quot;,&quot;r=h&quot;
&#039;---------------------------------------------------------------
&#039;Создание разделяемой области
hMap=CreateFileMappingAC.CreateFileMappingA( _
        -1, _
        0, _
        PAGE_READWRITE, _
        0, _
        4096, _
        &quot;scrmap&quot;)    
If hMap=0 Then 
MsgBox &quot;Невозможно создать разделяемую область памяти&quot;,vbExclamation,&quot;Error&quot;
WScript.Quit
End If
&#039;---------------------------------------------------------------
MsgBox _
&quot;Не закрывайте это сообщение,чтобы блокировать выполнение RUN.vbs&quot;, _
vbExclamation, _
&quot;RUN.vbs&quot;
&#039;---------------------------------------------------------------
&#039;Закрытие дескриптора hMap
Set CloseHandleC=CreateObject(&quot;DynamicWrapper&quot;)
CloseHandleC.Register _
&quot;KERNEL32.DLL&quot;,&quot;CloseHandle&quot;,&quot;i=h&quot;,&quot;f=s&quot;,&quot;r=l&quot;
CloseHandleC.CloseHandle hShare
&#039;---------------------------------------------------------------
Set CreateFileMappingAC=Nothing
Set CloseHandleC=Nothing</code></pre></div><p>Если RUN.VBS будет запущен первым, то запуск STOP.VBS остановит его выполнение. В ином случае, если оставить открытым сообщение скрипта STOP.vbs, то работа цикла в скрипте RUN.vbs станет невозможной, и он будет сразу же завершать свое выполнение.<br />Проверялось на Win98/Me/XP.<br />Автор примеров - <strong>Poltergeyst</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-07-06T07:27:43Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=12207#p12207</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH & HTA: обмен данными между скрипт-процессами]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=11816#p11816" />
			<content type="html"><![CDATA[<p>Другой способ аналогичного обмена данными.<br />Использование буферного файла. В данном случае процесс-клиент занимается отслеживанием факта записи данных в буферный файл со стороны сервера, читает данные и выводит в свое окно.<br />Потребуются библиотеки <a href="http://www.script-coding.com/LangMF.html">LangMf.Dll</a> и <a href="http://www.script-coding.com/AutiItX.html">AutoItX3.dll</a>.<br />Скрипт-сервер SERVER.HTA записывает данные в файл:<br /></p><div class="codebox"><pre><code>&lt;meta http-equiv=Content-Type content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;HTML&gt;
&lt;TITLE&gt;Data Exchange Sample Server&lt;/TITLE&gt;
&lt;HEAD&gt;
&lt;STYLE type=text/css&gt;
BODY    {background-color: #84c2fb;}
INPUT    {font-family: Lucida Console; font-size: 14px; font-weight: 700}
&lt;/STYLE&gt;
&lt;HTA:APPLICATION
    ID=&quot;DDESRV&quot;
    APPLICATIONNAME=&quot;ddeServ&quot;    
/&gt;
&lt;/HEAD&gt;

&lt;BODY SCROLL=&quot;NO&quot;&gt;
&lt;CENTER&gt;&lt;INPUT TYPE=&#039;TEXT&#039; ID=&#039;txt1&#039; SIZE=30&gt;&lt;/CENTER&gt;
&lt;CENTER&gt;&lt;INPUT TYPE=&#039;BUTTON&#039; ID=&#039;btn1&#039; VALUE=&#039;Отправить&#039;&gt;&lt;/CENTER&gt;
&lt;SCRIPT&gt;
/*Серверный скрипт для записи данных в буферный файл.
Скрипт-клиент отслеживает событие изменения буферного файла
и читает его содержимое*/
    
var scrRun    =new ActiveXObject(&#039;Scripting.FileSystemObject&#039;)
var wShell    =new ActiveXObject(&#039;WScript.Shell&#039;)
buferfile    =wShell.CurrentDirectory+&#039;\\ddefile.txt&#039;
    
window.moveTo    (0,300)
window.resizeTo    (500,250)
    
//------------------------------------------------------------------------
function btn1.onclick()
{    
    var stream=scrRun.OpenTextFile(buferfile,2,true)
    stream.Write(txt1.value)
    stream.Close()
}

//------------------------------------------------------------------------
function window.onbeforeunload()
{
    var stream=scrRun.OpenTextFile(buferfile,2,true)
    stream.Write(&#039;closeClient&#039;)
    stream.Close()
}
//------------------------------------------------------------------------
&lt;/SCRIPT&gt;    
&lt;/BODY&gt;
&lt;/HTML&gt;</code></pre></div><p>Скрипт-клиент CLIENT.JS отслеживает факт записи в буферный файл:<br /></p><div class="codebox"><pre><code>//Клиентский скрипт ожидающий уведомления об изменении буферного файла
//Потребуется зарегистрированная библиотека LangMf.Dll v7.7.0.0
//Потребуется зарегистрированная библиотека AutoItX3.Dll v3.2.0.1
    
//----------------------------------------------------------------------------------
var LMFCode=new String
var LMF        =new ActiveXObject(&#039;Atomix.LangMf&#039;)
var AutoItX3    =new ActiveXObject(&#039;AutoItX3.Control&#039;)
var scrRun    =new ActiveXObject(&#039;Scripting.FileSystemObject&#039;)
var wShell    =new ActiveXObject(&#039;WScript.Shell&#039;)
curDir=wShell.CurrentDirectory
//----------------------------------------------------------------------------------

LMFCode=
&#039;&lt;#Module=&gt;                                    \n&#039;+
&#039;Const FILE_NOTIFY_CHANGE_LAST_WRITE    =&amp;H10                    \n&#039;+
&#039;Public curDir                            \n&#039;+
&#039;Public hFirst                            \n&#039;+
&#039;;-----------------------------------------------------------------------------\n&#039;+
&#039;Sub Load(cmdstr)                        \n&#039;+
&#039;End Sub                            \n&#039;+
&#039;;-----------------------------------------------------------------------------\n&#039;+
&#039;Function FirstNotification(curDir)                    \n&#039;+
&#039;;Инициация начального объекта проверки файла на факт измемения\n&#039;+
&#039;hFirst    =Sys.DynApi.CallFunction( _                \n&#039;+
&#039;    &quot;KERNEL32.DLL&quot;, _                        \n&#039;+
&#039;    &quot;FindFirstChangeNotificationA&quot;, _                    \n&#039;+
&#039;        curDir, _                        \n&#039;+
&#039;        1, _                            \n&#039;+
&#039;        FILE_NOTIFY_CHANGE_LAST_WRITE)            \n&#039;+
&#039;End Function                                \n&#039;+
&#039;;-----------------------------------------------------------------------------    \n&#039;+
&#039;Function WaitNotification()                        \n&#039;+
&#039;;Активация объекта на ожидание изменений файла            \n&#039;+
&#039;    Sys.DynApi.CallFunction  _                    \n&#039;+
&#039;    &quot;KERNEL32.DLL&quot;, _                        \n&#039;+
&#039;    &quot;FindNextChangeNotification&quot;, _                    \n&#039;+
&#039;    hFirst                                \n&#039;+
&#039;;Ожидание .На этой инструкции скрипт встает до появления новой записи\n&#039;+
&#039;;в буферный файл со стороны скрипта сервера                \n&#039;+
&#039;    Sys.DynApi.CallFunction _                    \n&#039;+
&#039;        &quot;KERNEL32.DLL&quot;, _                    \n&#039;+
&#039;        &quot;WaitForSingleObject&quot;, _                    \n&#039;+
&#039;        hFirst,-1                            \n&#039;+
&#039;End Function                                \n&#039;+
&#039;;-----------------------------------------------------------------------------    \n&#039;+
&#039;Function CloseNotification()                        \n&#039;+
&#039;;Удаление начального объекта проверки файла на факт изменения    \n&#039;+
&#039;    hFirst        =Sys.DynApi.CallFunction( _            \n&#039;+
&#039;    &quot;KERNEL32.DLL&quot;, _                        \n&#039;+
&#039;    &quot;FindCloseChangeNotification&quot;, _                    \n&#039;+
&#039;    hFirst)                                \n&#039;+
&#039;End Function                                \n&#039;+
&#039;;-----------------------------------------------------------------------------    \n&#039;+
&#039;&lt;#Module&gt;&#039;
    LMFCode=LMFCode.replace(/(;)+/igm,&quot;&#039;&quot;)
LMF.Command(LMFCode)
LMF.FuncRun(&#039;FirstNotification&#039;,1,curDir)
//----------------------------------------------------------------------------------
AutoItX3.ToolTip(&#039;\nСкрипт клиент: нет сообщений от сервера\n&#039;,10,10)
wtNotifier()
//[Рекурсивный вызов ожидания изменений буферного файла]
//----------------------------------------------------------------------------------
function wtNotifier()
{
LMF.FuncRun(&#039;WaitNotification&#039;,1)
//После освобождения скрипта от ожидания объекта происходит чтение новых данных 
//буферного файла и их вывод в всплывающее окно
WScript.Sleep(300)
var stream=scrRun.OpenTextFile(wShell.CurrentDirectory+&#039;\\ddefile.txt&#039;,1)
data=stream.ReadAll()
WScript.Sleep(100)
stream.Close()
    //---------------------------------------------------------------------------
    if (data==&#039;closeClient&#039;)
    {
    LMF.FuncRun(&#039;CloseNotification&#039;,1);
    AutoItX3.ToolTip(&#039;&#039;);
    return
    }
    //---------------------------------------------------------------------------
AutoItX3.ToolTip(&#039;\nСкрипт клиент получил сообщение: &#039;+data+&#039;\n&#039;,10,10)
wtNotifier()
}
//----------------------------------------------------------------------------------</code></pre></div><p>Надо запустить оба скрипта одновременно, предварительно разместив их в пустом каталоге, ввести данные в поле ввода окна сервера и нажать &quot;Отправить&quot;.<br />Проверялось на Win98/Me/XP.<br />Автор примера - <strong>Poltergeyst</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-06-26T06:24:33Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=11816#p11816</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[WSH & HTA: обмен данными между скрипт-процессами]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=11778#p11778" />
			<content type="html"><![CDATA[<p>Для обмена данными потребуется скрипт-сервер, в котором формируется сообщение, и скрипт-клиент, который это сообщение <br />принимает, основываясь на определенном &quot;сигнале&quot; который подает сервер - будь то создание мутекса, изменение файла или возникновение еще какого-нибудь события. Мутекс - это сигнальный объект, принадлежащий процессу. В системе может существовать только один мутекс. Передача данных здесь идет через буфер обмена.</p><p>Возможно, это пригодится не только для обмена данными, но и для осуществления других трюков, связанных с синхронизацией процессов.</p><p>Потребуется зарегистрированная библиотека <a href="http://www.script-coding.com/LangMF.html">LangMf.Dll</a> v7.7.0.0.</p><p>Скрипт-сервер SERVER.HTA, создающий мутекс и копирующий данные в буфер:<br /></p><div class="codebox"><pre><code>&lt;meta http-equiv=Content-Type content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;HTML&gt;
&lt;TITLE&gt;Data Exchange Sample Server-Окно сервер&lt;/TITLE&gt;
&lt;HEAD&gt;
&lt;STYLE type=text/css&gt;
BODY    {background-color: #84c2fb;}
INPUT    {font-family: Lucida Console; font-size: 14px; font-weight: 700}
&lt;/STYLE&gt;
&lt;HTA:APPLICATION
    ID=&quot;DDESRV&quot;
    APPLICATIONNAME=&quot;ddeServ&quot;    
/&gt;
&lt;/HEAD&gt;

&lt;BODY SCROLL=&quot;NO&quot;&gt;
&lt;CENTER&gt;&lt;INPUT TYPE=&#039;TEXT&#039; ID=&#039;txt1&#039; SIZE=30&gt;&lt;/CENTER&gt;
&lt;CENTER&gt;&lt;INPUT TYPE=&#039;BUTTON&#039; ID=&#039;btn1&#039; VALUE=&#039;Отправить&#039;&gt;&lt;/CENTER&gt;
&lt;SCRIPT&gt;
/*Серверный скрипт для создания семафора-мутекса,существование
которого разрешает клиентскому скрипту считывание данных
из буфера обмена*/

//Потребуется зарегистрированная библиотека LangMf.Dll v7.7.0.0
    
window.moveTo    (0,0)
window.resizeTo    (500,250)

var LMFCode=new String
var LMF=new ActiveXObject(&#039;Atomix.LangMf&#039;)
    
LMFCode=
&#039;&lt;#Module=&gt;                             \n&#039;+
&#039;;---------------------------------------------------------------------    \n&#039;+
&#039;Sub Load(cmdstr)                        \n&#039;+
&#039;End Sub                            \n&#039;+
&#039;;----------------------------------------------------------------------      \n&#039;+    
&#039;Function CreateMutex()                         \n&#039;+
&#039;Sys.ClipBoard.SetText txt1.value                \n&#039;+
&#039;;Создание мутекса-семафора с заданным именем        \n&#039;+
&#039;hMutex=Sys.DynApi.CallFunction(&quot;KERNEL32.DLL&quot;,&quot;CreateMutexA&quot;, _\n&#039;+
&#039;                    0, _            \n&#039;+
&#039;                    False, _            \n&#039;+
&#039;                    &quot;DDEHTA&quot;)        \n&#039;+
&#039;;Разрешение на открытие мутекса клиентским скриптом        \n&#039;+
&#039;;который примет данные из буфера обмена и уничтожит мутекс    \n&#039;+
&#039;Sys.DynApi.CallFunction &quot;KERNEL32.DLL&quot;,&quot;ReleaseMutex&quot;,hMutex    \n&#039;+
&#039;End Function                            \n&#039;+
&#039;;----------------------------------------------------------------------      \n&#039;+
&#039;;Уничтожение мутекса при выходе из приложения        \n&#039;+
&#039;Function CloseHandle()                        \n&#039;+
&#039;    Sys.DynApi.CallFunction &quot;KERNEL32.DLL&quot;,&quot;CloseHandle&quot;,hMutex    \n&#039;+
&#039;End Function                            \n&#039;+
&#039;;----------------------------------------------------------------------      \n&#039;+
&#039;&lt;#Module&gt;&#039;

LMFCode=LMFCode.replace(/(;)+/igm,&quot;&#039;&quot;)
LMF.AddObject(txt1,&#039;txt1&#039;)
LMF.Command(LMFCode)
//------------------------------------------------------------------------
function btn1.onclick()
{
    LMF.FuncRun(&#039;CreateMutex&#039;,1)
}
//------------------------------------------------------------------------
function window.onbeforeunload()
{
    LMF.FuncRun(&#039;CloseHandle&#039;,1)
    LMF.Reset()
}
//------------------------------------------------------------------------
&lt;/SCRIPT&gt;    
&lt;/BODY&gt;
&lt;/HTML&gt;</code></pre></div><p>Скрипт-клиент CLIENT.HTA, отслеживающий появление мутекса и читающий данные буфера обмена:<br /></p><div class="codebox"><pre><code>&lt;meta http-equiv=Content-Type content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;HTML&gt;
&lt;TITLE&gt;Data Exchange Sample Clent-Окно клиент&lt;/TITLE&gt;
&lt;HEAD&gt;
&lt;STYLE type=text/css&gt;
BODY    {background-color: #84c2fb;}
P    {font-family: Lucida Console; font-size: 18px; font-weight: 700}
&lt;/STYLE&gt;
&lt;HTA:APPLICATION
    ID=&quot;DDEClient&quot;
    APPLICATIONNAME=&quot;ddeClient&quot;    
/&gt;
&lt;/HEAD&gt;
&lt;BODY SCROLL=&quot;NO&quot;&gt;
&lt;CENTER&gt;&lt;P ID=&#039;clientText&#039;&gt;&lt;/P&gt;&lt;/CENTER&gt;
&lt;SCRIPT&gt;
/*Клиентский скрипт получающий данные от скрипта-сервера
через буфер обмена после обнаружения в системе мутекса*/
    
//Потребуется зарегистрированная библиотека LangMf.Dll v7.7.0.0
    
var timerCall
    
window.moveTo    (0,300)
window.resizeTo    (500,250)
    
//----------------------------------------------------------------------
var LMFCode=new String
var LMF=new ActiveXObject(&#039;Atomix.LangMf&#039;)
    
LMFCode=
&#039;&lt;#Module=&gt;                            \n&#039;+
&#039;Const MUTEX_ALL_ACCESS    =&amp;H1f0001            \n&#039;+
&#039;Public hMutex                            \n&#039;+
&#039;;---------------------------------------------------------------------    \n&#039;+
&#039;Sub Load(cmdstr)                        \n&#039;+
&#039;End Sub                            \n&#039;+
&#039;;----------------------------------------------------------------------      \n&#039;+
&#039;Function WaitMutexMf()                        \n&#039;+
&#039;;Попытка открыть мутекс-семафор с заданным именем        \n&#039;+
&#039;WaitMutexMf=Sys.DynApi.CallFunction(    _                                  \n&#039;+
&#039;&quot;KERNEL32.DLL&quot;,&quot;OpenMutexA&quot;, _                                        \n&#039;+
&#039;                MUTEX_ALL_ACCESS, _        \n&#039;+
&#039;                True, _                \n&#039;+
&#039;                &quot;DDEHTA&quot;)            \n&#039;+
&#039;;и сразу же уничтожить его                    \n&#039;+
&#039;Sys.DynApi.CallFunction &quot;KERNEL32.DLL&quot;,&quot;CloseHandle&quot;,WaitMutexMf\n&#039;+
&#039;End Function                            \n&#039;+
&#039;;----------------------------------------------------------------------      \n&#039;+
&#039;Function GetData()                        \n&#039;+
&#039;    GetData=Sys.ClipBoard.GetText()            \n&#039;+
&#039;End Function                            \n&#039;+
&#039;;----------------------------------------------------------------------       \n&#039;+
&#039;&lt;#Module&gt;&#039;

LMFCode=LMFCode.replace(/(;)+/igm,&quot;&#039;&quot;)
LMF.Command(LMFCode)
waitMutex()
    
//[Проверка на появление в системе мутекса с заданным именем]
//-----------------------------------------------------------------------
function waitMutex()
{
hMutex=LMF.FuncRun(&#039;WaitMutexMf&#039;,1)
    if (hMutex!=0)
    {
    Str=LMF.FuncRun(&#039;GetData&#039;,1)
    clientText.innerText=Str
    }
    timerCall=window.setTimeout(&#039;waitMutex()&#039;,500)
}
//------------------------------------------------------------------------
function window.onclose()
{
    window.clearTimeout(timerCall,100)
    LMF.Reset()
}
//------------------------------------------------------------------------
&lt;/SCRIPT&gt;    
&lt;/BODY&gt;
&lt;/HTML&gt;</code></pre></div><p>Надо запустить оба скрипта одновременно, ввести данные в поле ввода окна сервера и нажать &quot;Отправить&quot;.<br />Проверялось на Win98/Me/XP.<br />Автор примера - <strong>Poltergeyst</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-06-25T08:23:31Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=11778#p11778</id>
		</entry>
</feed>
