<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: COM-сервер для управления окнами HTA]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=2299&amp;type=atom" />
	<updated>2009-03-12T08:38:02Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=2299</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: COM-сервер для управления окнами HTA]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=20580#p20580" />
			<content type="html"><![CDATA[<p>Вариант ActiveX в EXE (саморегистрируемый ActiveX, достаточно один раз запустить для регистрации в реестре). Если ActiveХ DLL встраивается в адресное пространство вызывающего процесса, то ActiveX EXE — независимый процесс, присутствующий в списке процессов, и при выходе из вызывающего приложения он должен выгрузиться из памяти.<br />В архиве во вложении поста — сам ActiveX и демонстрационный пример (запускать <strong>PROCESS1.vbs</strong>).<br />Автор решения — <strong>ingvar68</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-03-12T08:38:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=20580#p20580</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: COM-сервер для управления окнами HTA]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=19622#p19622" />
			<content type="html"><![CDATA[<p>С помощью вышеприведённого COM-сервера можно транслировать объект WScript в HTA.<br />Создайте файл <strong>C:\Temp\test.js</strong>:<br /></p><div class="codebox"><pre><code>var HTA = new ActiveXObject(&quot;FindHTA68.HTA68&quot;);
WScript.Sleep(500);
var dom = HTA.HTA(&quot;Трансляция объекта WScript&quot;).parentWindow;
var global = this;
    dom.WScript = WScript;

dom.Register = function (EventName, EventHandler)
{
    global[EventName] = EventHandler;
}

for (;;) WScript.Sleep(0x7fffffff);</code></pre></div><p>Демонстрационное HTA-приложение:<br /></p><div class="codebox"><pre><code>&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;Трансляция объекта WScript&lt;/TITLE&gt;
&lt;HTA:APPLICATION
    BORDER=&quot;thin&quot;
    CAPTION=&quot;yes&quot; /&gt;
&lt;SCRIPT&gt;
function window.onload(){
    var WScriptProcess = (new ActiveXObject(&quot;WScript.Shell&quot;)).Exec(&#039;wscript.exe \&quot;&#039; +
                               &#039;C:\\Temp\\test.js&#039; + &#039;\&quot;&#039;);
    window.attachEvent(&#039;onunload&#039;,
    function () {
        try {WScriptProcess.Terminate()} catch (e) {}; return false;
    });
}
function demo(){
    alert(&#039;Через 3 секунды после нажатия на \&quot;ОК\&quot; текст будет изменён...&#039;)
    WScript.Sleep(3000);
    if (oH1.innerText == &#039;Текст изменён&#039;){
        oH1.innerText = &#039;Использование объекта WScript в HTA&#039;;
    } else {
        oH1.innerText = &#039;Текст изменён&#039;;
    }
}
&lt;/SCRIPT&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
    &lt;H1 ID=oH1&gt;Использование объекта WScript в HTA&lt;/H1&gt;
    &lt;button onclick=&quot;demo();&quot;&gt;Демонстация метода WScript.Sleep()&lt;/button&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;</code></pre></div><p>Автор идеи — <strong>JSman</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-02-17T18:21:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=19622#p19622</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: COM-сервер для управления окнами HTA]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=14471#p14471" />
			<content type="html"><![CDATA[<p>COM-сервер по заголовку окна HTA возвращает объект IHTMLDocument, что даёт возможность полностью управлять этим окном из скрипта VBScript или другого HTA. Перекликается с этой темой: <a href="http://forum.script-coding.com/viewtopic.php?id=1803">VBScript: конструирование и выдача диалогов с помощью HTA</a>. Исходник (VB 6):<br /></p><div class="codebox"><pre><code>Private Const SMTO_ABORTIFHUNG = &amp;H2
Private Type UUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(0 To 7) As Byte
End Type
Private Declare Function ObjectFromLresult Lib &quot;oleacc&quot; ( _
   ByVal lResult As Long, _
   riid As UUID, _
   ByVal wParam As Long, _
   ppvObject As Any) As Long
Private Declare Function EnumChildWindows Lib &quot;user32&quot; (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Private Declare Function RegisterWindowMessage Lib &quot;user32&quot; Alias _
  &quot;RegisterWindowMessageA&quot; (ByVal lpString As String) As Long Private Declare Function SendMessageTimeout Lib &quot;user32&quot; _
  Alias &quot;SendMessageTimeoutA&quot; _
 (ByVal hwnd As Long, ByVal msg As Long, _
  ByVal wParam As Long, ByVal lParam As Long, _
  ByVal fuFlags As Long, ByVal uTimeout As Long, _
  lpdwResult As Long) As Long
  
Private Declare Function FindWindowEx Lib &quot;user32&quot; Alias &quot;FindWindowExA&quot; (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function FindWindow Lib &quot;user32&quot; Alias &quot;FindWindowA&quot; (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Function HTA(ByVal WHAT As String) As Object  &#039;IHTMLDocument2 &#039;IHTMLDocument Dim hwnd As Long

hwnd = FindWindow(&quot;HTML Application Host Window Class&quot;, WHAT) If hwnd &lt;&gt; 0 Then
   Set HTA = IEDOMFromhWnd(hwnd)
  Else
   &#039;MsgBox &quot;Не найден &quot; &amp; WHAT
   Set HTA = Nothing
End If
End Function
Function IEDOMFromhWnd(ByVal hwnd As Long) As Object &#039;IHTMLDocument2
  Dim IID_IHTMLDocument As UUID
  Dim hWndChild As Long
  Dim lRes As Long
  Dim lMsg As Long
  Dim hr As Long
  If hwnd &lt;&gt; 0 Then
    hWndChild = FindWindowEx(hwnd, ByVal 0&amp;, &quot;Internet Explorer_Server&quot;, vbNullString)
    If hWndChild &lt;&gt; 0 Then
      lMsg = RegisterWindowMessage(&quot;WM_HTML_GETOBJECT&quot;)
      SendMessageTimeout hWndChild, lMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes
      If lRes Then
        With IID_IHTMLDocument
          .Data1 = &amp;H626FC520
          .Data2 = &amp;HA41E
          .Data3 = &amp;H11CF
          .Data4(0) = &amp;HA7
          .Data4(1) = &amp;H31
          .Data4(2) = &amp;H0
          .Data4(3) = &amp;HA0
          .Data4(4) = &amp;HC9
          .Data4(5) = &amp;H8
          .Data4(6) = &amp;H26
          .Data4(7) = &amp;H37
        End With
        hr = ObjectFromLresult(lRes, IID_IHTMLDocument, 0, IEDOMFromhWnd)
      End If
    Else
     Set IEDOMFromhWnd = Nothing
     MsgBox &quot;Не найден Internet Explorer_Server&quot;
    End If
  End If
End Function</code></pre></div><p>Автор решения - <strong>ingvar68</strong>.<br />Пример использования:<br /></p><div class="codebox"><pre><code>Set HTA = CreateObject(&quot;FindHTA68.HTA68&quot;)
Set CWindow = HTA.HTA(&quot;Заголовок окна HTA&quot;)
CWindow.ParentWindow.Close</code></pre></div><p>Ещё один пример:<br /></p><div class="codebox"><pre><code>Set HTA = CreateObject(&quot;FindHTA68.HTA68&quot;)
Set CWindow = HTA.HTA(&quot;Sample Application&quot;)
WScript.Echo TypeName(CWindow)
WScript.Echo TypeName(CWindow.ParentWindow)
CWindow.body.innerHTML = &quot;&lt;h1&gt;Привет, FindHTA68.HTA68!&lt;/h1&gt;&quot;
For i=0 To 12
    CWindow.body.innerHTML = CWindow.body.innerHTML &amp; &quot;&lt;h1&gt;Привет, FindHTA68.HTA68!&lt;/h1&gt;&quot;
    WScript.Sleep 1000
Next</code></pre></div><p>Во вложении поста - скомпилированная DLL (скомпилировал <strong>Xameleon</strong>).</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-10-04T08:50:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=14471#p14471</id>
		</entry>
</feed>
