Сообщений 11    Оценка 162        Оценить  
Система Orphus

QnA: Получение COM-событий в скриптах

Авторы: Алексей Кирюшкин
The RSDN Group
Andrew Merkushev
Опубликовано: 29.12.2004
Исправлено: 10.12.2016
Версия текста: 2.0
VBA
JScript
VBScript
JavaScript

VBA

Q: Юзаю из hta объект winsock, никак не получается перехватить события, может этого вообще нельзя сделать? Один из вариантов на VBA:

      set ws=createobject("MSWinsock.Winsock.1")
Sub ws_ConnectionRequest (requestID)
   If ws.State <> sckClosed Then ws.Close
   ws.Accept requestID
   msgbox requestID
EndSub

ws.Protocol=0
ws.LocalPort=8080
ws.Listen

Объект создается и на порт цепляется, а вот к событиям прицепиться никак :(

A: Ключевое слово WithEvents при определении ws:

      Dim
      WithEvents ws As MSWinsock.Winsock
Sub ws_ConnectionRequest ( requestID )
   '...EndSub

Имя метода для перехвата события составляется как ИмяОбъекта_Имя События (ws_ConnectionRequest).

JScript

Q: Спасибо, а в JScript это возможно сделать?

A: Вместо функции ActiveXObject() COM объект надо создавать при помощи метода CreateObject() объекта WScript:

      var ws = WScript.CreateObject("MSWinsock.Winsock","WS_");

function WS_ConnectionRequest( requestID )
{
   // ...
}

При возникновении события из JScript будет вызвана функция с названием, составленым из префикса, переданного в CreateObject() (WS_) и имени события (ConnectionRequest).

Аналогично в VBScript, где не поддерживается WithEvents:

VBScript

      Set ws = WScript.CreateObject("MSWinsock.Winsock","WS_")

Sub WS_ConnectionRequest( requestID )
   ' ...EndSub

JavaScript

Q: А в JavaScript? Я делаю так:

<object classid="CLSID:xxxxxx" id=TestControl>
</object>

в этом ActiveX TestControl есть событие OnExecute. Вот на него надо повесить обработчик.

A: Вот пример htm:

<HTML>
<HEAD>
<TITLE>ATL 7.0 test page for object CTestEvent</TITLE>

<script for="CTestEvent"event="OnSendNotification();"language="JavaScript">
  alert("From HTML event handler");
</script>

<script language="JavaScript">

function TestMe()
{
     CTestEvent.TestMe();
}

</script>

</HEAD>
<BODY>

<button onclick="TestMe();">Connect</button>
<br>

<OBJECT ID="CTestEvent"CLASSID="CLSID:C60EFBCA-7B1F-4452-A753-3782FA320404"VIEWASTEXT>
</OBJECT>

</BODY>
</HTML>

и проект тестового ActiveX генерирующего событие OnSendNotification() при вызове его метода TestMe():

STDMETHODIMP CCTestEvent::TestMe(void)
{
    Fire_OnSendNotification(CComBSTR("TestMethod"), CComBSTR("TestParams"));

    return S_OK;
}


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 11    Оценка 162        Оценить