Тема: WSH & HTA: обмен данными между скрипт-процессами
Для обмена данными потребуется скрипт-сервер, в котором формируется сообщение, и скрипт-клиент, который это сообщение
принимает, основываясь на определенном "сигнале" который подает сервер - будь то создание мутекса, изменение файла или возникновение еще какого-нибудь события. Мутекс - это сигнальный объект, принадлежащий процессу. В системе может существовать только один мутекс. Передача данных здесь идет через буфер обмена.
Возможно, это пригодится не только для обмена данными, но и для осуществления других трюков, связанных с синхронизацией процессов.
Потребуется зарегистрированная библиотека LangMf.Dll v7.7.0.0.
Скрипт-сервер SERVER.HTA, создающий мутекс и копирующий данные в буфер:
<meta http-equiv=Content-Type content="text/html; charset=windows-1251">
<HTML>
<TITLE>Data Exchange Sample Server-Окно сервер</TITLE>
<HEAD>
<STYLE type=text/css>
BODY {background-color: #84c2fb;}
INPUT {font-family: Lucida Console; font-size: 14px; font-weight: 700}
</STYLE>
<HTA:APPLICATION
ID="DDESRV"
APPLICATIONNAME="ddeServ"
/>
</HEAD>
<BODY SCROLL="NO">
<CENTER><INPUT TYPE='TEXT' ID='txt1' SIZE=30></CENTER>
<CENTER><INPUT TYPE='BUTTON' ID='btn1' VALUE='Отправить'></CENTER>
<SCRIPT>
/*Серверный скрипт для создания семафора-мутекса,существование
которого разрешает клиентскому скрипту считывание данных
из буфера обмена*/
//Потребуется зарегистрированная библиотека LangMf.Dll v7.7.0.0
window.moveTo (0,0)
window.resizeTo (500,250)
var LMFCode=new String
var LMF=new ActiveXObject('Atomix.LangMf')
LMFCode=
'<#Module=> \n'+
';--------------------------------------------------------------------- \n'+
'Sub Load(cmdstr) \n'+
'End Sub \n'+
';---------------------------------------------------------------------- \n'+
'Function CreateMutex() \n'+
'Sys.ClipBoard.SetText txt1.value \n'+
';Создание мутекса-семафора с заданным именем \n'+
'hMutex=Sys.DynApi.CallFunction("KERNEL32.DLL","CreateMutexA", _\n'+
' 0, _ \n'+
' False, _ \n'+
' "DDEHTA") \n'+
';Разрешение на открытие мутекса клиентским скриптом \n'+
';который примет данные из буфера обмена и уничтожит мутекс \n'+
'Sys.DynApi.CallFunction "KERNEL32.DLL","ReleaseMutex",hMutex \n'+
'End Function \n'+
';---------------------------------------------------------------------- \n'+
';Уничтожение мутекса при выходе из приложения \n'+
'Function CloseHandle() \n'+
' Sys.DynApi.CallFunction "KERNEL32.DLL","CloseHandle",hMutex \n'+
'End Function \n'+
';---------------------------------------------------------------------- \n'+
'<#Module>'
LMFCode=LMFCode.replace(/(;)+/igm,"'")
LMF.AddObject(txt1,'txt1')
LMF.Command(LMFCode)
//------------------------------------------------------------------------
function btn1.onclick()
{
LMF.FuncRun('CreateMutex',1)
}
//------------------------------------------------------------------------
function window.onbeforeunload()
{
LMF.FuncRun('CloseHandle',1)
LMF.Reset()
}
//------------------------------------------------------------------------
</SCRIPT>
</BODY>
</HTML>
Скрипт-клиент CLIENT.HTA, отслеживающий появление мутекса и читающий данные буфера обмена:
<meta http-equiv=Content-Type content="text/html; charset=windows-1251">
<HTML>
<TITLE>Data Exchange Sample Clent-Окно клиент</TITLE>
<HEAD>
<STYLE type=text/css>
BODY {background-color: #84c2fb;}
P {font-family: Lucida Console; font-size: 18px; font-weight: 700}
</STYLE>
<HTA:APPLICATION
ID="DDEClient"
APPLICATIONNAME="ddeClient"
/>
</HEAD>
<BODY SCROLL="NO">
<CENTER><P ID='clientText'></P></CENTER>
<SCRIPT>
/*Клиентский скрипт получающий данные от скрипта-сервера
через буфер обмена после обнаружения в системе мутекса*/
//Потребуется зарегистрированная библиотека LangMf.Dll v7.7.0.0
var timerCall
window.moveTo (0,300)
window.resizeTo (500,250)
//----------------------------------------------------------------------
var LMFCode=new String
var LMF=new ActiveXObject('Atomix.LangMf')
LMFCode=
'<#Module=> \n'+
'Const MUTEX_ALL_ACCESS =&H1f0001 \n'+
'Public hMutex \n'+
';--------------------------------------------------------------------- \n'+
'Sub Load(cmdstr) \n'+
'End Sub \n'+
';---------------------------------------------------------------------- \n'+
'Function WaitMutexMf() \n'+
';Попытка открыть мутекс-семафор с заданным именем \n'+
'WaitMutexMf=Sys.DynApi.CallFunction( _ \n'+
'"KERNEL32.DLL","OpenMutexA", _ \n'+
' MUTEX_ALL_ACCESS, _ \n'+
' True, _ \n'+
' "DDEHTA") \n'+
';и сразу же уничтожить его \n'+
'Sys.DynApi.CallFunction "KERNEL32.DLL","CloseHandle",WaitMutexMf\n'+
'End Function \n'+
';---------------------------------------------------------------------- \n'+
'Function GetData() \n'+
' GetData=Sys.ClipBoard.GetText() \n'+
'End Function \n'+
';---------------------------------------------------------------------- \n'+
'<#Module>'
LMFCode=LMFCode.replace(/(;)+/igm,"'")
LMF.Command(LMFCode)
waitMutex()
//[Проверка на появление в системе мутекса с заданным именем]
//-----------------------------------------------------------------------
function waitMutex()
{
hMutex=LMF.FuncRun('WaitMutexMf',1)
if (hMutex!=0)
{
Str=LMF.FuncRun('GetData',1)
clientText.innerText=Str
}
timerCall=window.setTimeout('waitMutex()',500)
}
//------------------------------------------------------------------------
function window.onclose()
{
window.clearTimeout(timerCall,100)
LMF.Reset()
}
//------------------------------------------------------------------------
</SCRIPT>
</BODY>
</HTML>
Надо запустить оба скрипта одновременно, ввести данные в поле ввода окна сервера и нажать "Отправить".
Проверялось на Win98/Me/XP.
Автор примера - Poltergeyst.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.