1

Тема: VBS: Разрушительный сбой ActiveX компоненты

День добрый!

Хочу использовать компоненту GTSIPCtrl.ocx из пакета
PCBest Networks SIP SDK API, которая позволит работать с SIP протоколом, в том числе сделать софтфон. На сайте написано, что ее можно вызывать из любого языка, который работает с ActiveX, в том числе и из JavaScript. Есть примеры на различных языках, но нет примера на VBS/яве или чего-то похоже. http://www.pcbest.net/sdk/PCBest-SIPSDK-v2.05g.zip

Библиотеку зарегистрировал regsvr32 GTSIPCtrl.ocx.

Dim GTSIPAPI
Set GTSIPAPI = CreateObject("GTSIPCTRL.GTSIPAPICtrl.1")

GTSIPAPI.AboutBox

Возникает ошибка "Разрушительный сбой" на 4 строке и так с любым методом или свойством объекта, такое впечатление, что я как-то не доинициализировал компоненту.

2

Re: VBS: Разрушительный сбой ActiveX компоненты

Нашел пример на JavaScript+HTML, но там создание объекта просиходит другим способом:

<OBJECT id=GTSIPObj style="WIDTH: 10px; HEIGHT: 10px" 
CODEBASE="http://www.pcbest.net/sdk/GTSIPCtrl.ocx#version=2,0,3,8"
classid=clsid:FF888D2E-39C2-42CC-879E-2D7BA36480E7>
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="9551">
<PARAM NAME="_ExtentY" VALUE="9181">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>

Можно ли вызвать этот объект на чистом vbs аналогичным способом?

3

Re: VBS: Разрушительный сбой ActiveX компоненты

это актвикс, а не ком

Я конечно далек от мысли... (с)

4

Re: VBS: Разрушительный сбой ActiveX компоненты

moobi, не факт. Некоторые .ocx работают только внутри контейнера. Попробуйте использовать *.hta.

5

Re: VBS: Разрушительный сбой ActiveX компоненты

Я не совсем в теме, что значит "внутри контейнера"?

6

Re: VBS: Разрушительный сбой ActiveX компоненты

что значит "внутри контейнера"?

WebBrowser, форма VB/VBA и т.п.

Introduction to ActiveX Control Containers

7

Re: VBS: Разрушительный сбой ActiveX компоненты

Да, некоторые activex-компоненты завязаны на оконный контейнер, вот пример:
http://habrahabr.ru/post/149277/

8

Re: VBS: Разрушительный сбой ActiveX компоненты

Еще бы какой-нить "рабочий" пример на vbs-е, который должен работать, потому как код из 1-го поста запустить удалось, после небольших  доп. манипуляций.

9

Re: VBS: Разрушительный сбой ActiveX компоненты

Вот такой код у меня работает в 1С-ке - слышна музыка.

Set Obj  = CreateObject(""GTSIPCTRL.GTSIPAPICtrl.1"")
Set Wrap = CreateObject(""DynamicWrapperX"")

'Немного поправим объект
pObj  = Wrap.GetIDispatch(Obj)
'MsgBox Hex(pObj)
pObj1 = pObj - &h10
Wrap.NumPut -1, pObj1, &hAC

Obj.AboutBox
Obj.CreateEnv 
Obj.CFGSetValue ""gtsrv.sip.server.model"", ""0""                     '0 = client phone 1 = sip server app
Obj.CFGSetValue ""gtsrv.sip.ip.port"", ""5076""


'RTP PORT
Obj.CFGSetValue ""gtsrv.sip.rtpstartrange"", ""17400""
Obj.CFGSetValue ""gtsrv.sip.rtpendrange"", ""17800""

'Log
Obj.CFGSetValue ""gtsrv.log.level"", ""4""
Obj.CFGSetValue ""gtsrv.log.filename"", ""c:\Temp\simplephone.txt""

'channnel numbers, here we only use 1 channel
Obj.CFGSetValue ""gtsrv.sip.boardnum.per.server"", ""1""
Obj.CFGSetValue ""gtsrv.sip.spannum.per.board"", ""1""
Obj.CFGSetValue ""gtsrv.sip.channum.per.span"", ""1""

'Internal communication port
Obj.CFGSetValue ""gtsrv.net.port"", ""8914""
    
Obj.CFGSetValue ""gtsrv.sip.prefered.codec"", ""0,8""

res = Obj.StartServer()
'MsgBox res

res = Obj.SendMake (0, ""<sip:8888@pcbest.net>"", """")
'MsgBox res

Obj.SendStartDXAudio 0
'codec = Obj.GetChanAudioCodec(0)
'MsgBox codec

10

Re: VBS: Разрушительный сбой ActiveX компоненты

chessman, спасибо, ты нереально крут. Жалко, я поздно увидел твой пост и целый день изголялся над вызовом компоненты. Последняя супермысль, после HTA (который к слову работает), и его оригинальных вызовов, типа:

Set wshExec = CreateObject("WScript.Shell").Exec("mshta about:""<script>moveTo(-1000,-1000);resizeTo(0,0);</script>" &_
                            "<hta:application showintaskbar=no />" &_
                            "<object id=" & id & " classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object>""")

Пришел к варианту, сделать com-сервер WSC, по примеру http://forum.script-coding.com/viewtopic.php?id=1037, который бы уже вызывал функции SIP компоненты, но план мой провалился, скрипт выпадает с той же ошибкой.

Может мой план не безнадежен, я что-то упустил и com компонента позволит обойти ограничение запуска из контейнера? Просто из любопытства, решение chessman, безусловно лучше.

Так я делал:

Test.wsc

<?xml version='1.0' encoding='windows-1251' standalone='yes'?>
<component>
<registration progid='TestWSC'/>
<public>
    <method name='AboutBox'/>
</public>

<object id="GTSIPObj" classid="{FF888D2E-39C2-42CC-879E-2D7BA36480E7}"/>

<script language="JScript"><![CDATA[

function AboutBox(){
return GTSIPObj.AboutBox();
}

]]></script>
</component>

А вызывал соответственно:

Set com=CreateObject("TestWSC")
com.AboutBox()

11 (изменено: chessman, 2012-08-10 18:01:46)

Re: VBS: Разрушительный сбой ActiveX компоненты

На сколько я понимаю, контейнер требуется в первую очередь для ловли событий от активИкса. В vbs'е (стандартным образом) мы их поймать никак не сможем (может я ошибаюсь? Может в JavaScript есть обработка событий?).

moobi, расскажи, как ты видишь использование этого АктивИкса (последовательность действий пользователя, интерфейс, чем не устраивает web-интерфейс и т.д.).

12

Re: VBS: Разрушительный сбой ActiveX компоненты

Вы правильно уловили ход моей мысли, этот активикс мне нужно использовать как com-компонент, для вызова из 1c. Запускаю, из vbs, просто из-за удобства отладки. Потом код перенесу в 1с.

Существует внешняя компонента 1с "Обеликс" http://mshapkin.narod.ru/obeliks/obelisk_r.rar, она вызывает методы и события GTSIPCtrl.ocx, но набор событий и методов, который через нее можно вызвать далеко не весь, который  есть в компоненте активикс. В частности мне нужно нужно открыть порт 5060 для приема звонков в режиме peer-to-peer, без регистрации на sip сервере.

Собственно поэтому мне хотелось ее вызвать напрямую, как com компонент, минуя обеликс.

13

Re: VBS: Разрушительный сбой ActiveX компоненты

7.7 или 8.x?

14

Re: VBS: Разрушительный сбой ActiveX компоненты

7.7

15

Re: VBS: Разрушительный сбой ActiveX компоненты

А какие именно методы и события хотелось бы вызывать?

16 (изменено: moobi, 2012-08-10 23:42:54)

Re: VBS: Разрушительный сбой ActiveX компоненты

        GTSIPAPI1.CreateEnv
        GTSIPAPI1.CFGSetValue "gtsrv.sip.server.model", "0"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.ip.address", ""
        GTSIPAPI1.CFGSetValue "gtsrv.sip.ip.port", "5076"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.rtpstartrange", "17400"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.rtpendrange", "17800"
        GTSIPAPI1.CFGSetValue "gtsrv.log.level", "4"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.boardnum.per.server", "1"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.spannum.per.board", "1"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.channum.per.span", "1"
        GTSIPAPI1.CFGSetValue "gtsrv.log.filename", "c:\simplephone.txt"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.prefered.codec", "0,8"
        GTSIPAPI1.CFGSetValue "gtsrv.net.port", "8914"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg.client.num", "1"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.DisplayName", "user1"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.username", "1111"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.domain", "127.0.0.1"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.proxy", "127.0.0.1"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.authorization", "1111"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.password", "1111"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.expire", "3600"
        GTSIPAPI1.CFGSetValue "gtsrv.sip.reg1.register", "0"
        
        GTSIPAPI1.StartServer
        GTSIPAPI1.StopServer   
        GTSIPAPI1.DestroyEnv

        GTSIPAPI1.SendTransfer 0, "<sip:8888@pcbest.net>"

        GTSIPAPI1. ProcessGTAPIEvent()

                События

        GTSIPAPI1_OnCallIdle(ByVal ChanID As Long)
        GTSIPAPI1_OnCallOffered(ByVal ChanID As Long, ByVal Caller As String, ByVal Callee As String, ByVal DestAddr As String, ByVal ViaAddr As String, ByVal IPAddr As String, ByVal IPPort As Long)

Наверное все. Мне нужно из 1с открыть порт SIP без SIP сервера, ждать звонка, узнать Caller ID и ничего не делать.

Хотелось бы получить доступ ко все функциям и событиям, тогда можно было бы что-нибудь крутое потом додумать. Но на первоначальном этапе этого достаточно.

17

Re: VBS: Разрушительный сбой ActiveX компоненты

Хм...прикол, в 7.7, если id метода < 0, то 1С его тупо не воспринимает (void AboutBox(); у [id(0xfffffdd8)]), считает, что это ошибка.
С другой стороны, только у AboutBox отрицательный id, зачем так сделано?

18

Re: VBS: Разрушительный сбой ActiveX компоненты

Твоя задача решается с помощью

    АктивИкс = СоздатьОбъект("АктивИкс");
    АктивИкс.УстановитьАтрибут(Форма,"sip"); 
    АктивИкс.СоздатьЭУ("GTSIPCTRL.GTSIPAPICtrl.1");
    АктивИкс.ОбработкаСобытий = 1;

и класса Таймер.

События прилетают в форму, так что сможешь работать с активИксом напрямую, без использования доп. компонент (1С++ required).

19

Re: VBS: Разрушительный сбой ActiveX компоненты

Спасибо огромное. Буду пробовать.