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).
Q: Спасибо, а в JScript это возможно сделать?
A: Вместо функции ActiveXObject() COM объект надо создавать при помощи метода CreateObject() объекта WScript:
var ws = WScript.CreateObject("MSWinsock.Winsock","WS_"); function WS_ConnectionRequest( requestID ) { // ... } |
При возникновении события из JScript будет вызвана функция с названием, составленым из префикса, переданного в CreateObject() (WS_) и имени события (ConnectionRequest).
Аналогично в VBScript, где не поддерживается WithEvents:
Set ws = WScript.CreateObject("MSWinsock.Winsock","WS_") Sub WS_ConnectionRequest( requestID ) ' ...EndSub |
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; } |