Event от внешней библиотеки

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

Как работать с сабжем? Суть задачи - нужен SIP. После молчания в топике http://forum.clarionlife.net/phpbb/view ... f=1&t=3384 я прошерстил весь инет, группы за последние несколько лет, и т.д. и т.п. и нашел ровно ноль на эту тему, нет даже намека хоть на какой-то 3rdparty продукт вида "SIP в Clarion". Видимо придется писать SIP клиент самим. С нуля я конечно такое ни в жисть не напишу, но вот есть несколько SDK различных вариантов, есть даже Native DLL (по мне так идеальный вариант), они конечно не бесплатные но это вторичный вопрос. Так вот, если работа с функциями более менее понятна, то я никогда не работал с событиями из внешних библиотек. Ну например:

Код: Выделить всё

OnAlerting Event
Call has been accepted and the application should alert the end user

C++
__event void OnAlerting(BSTR sFromURI, BSTR sLocalURI, INT nLine);

C#
event void OnAlerting(string sFromURI, string sLocalURI, int nLine);

Parameters
Parameters  Description  
sFromURI  Remote participant SIP URI  
sLocalURI  Local participant SIP URI  
nLine  Phone line number
Ищется пример, как это все описать
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Event от внешней библиотеки

Сообщение PavelNK »

Пишешь свою процедуру с прототипом void OnAlerting(string sFromURI, string sLocalURI, int nLine);
Затем ее регистрируешь через SDK. Когда произойдет событие SDK вызовет твою процедуру.
А ты должен будешь разобраться в процедуре, в соответствии с полученными параметрами, какое событие произошло и обработать его в соответствии с твоими потребностями.
Только нужно не забыть отменить регистрацию при выходе из программы, а то может упасть SDK.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

PavelNK писал(а): Затем ее регистрируешь через SDK.
Это как? Пример бы
Вот тут прототипы http://sipeksdk.googlecode.com/svn/trun ... pjsipDll.h
Так вроде всё понятно, кроме того, а что передавать ну допустим в onRegStateCallback
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Event от внешней библиотеки

Сообщение Дед Пахом »

RaFaeL писал(а):
PavelNK писал(а): Затем ее регистрируешь через SDK.
Это как? Пример бы
Вот тут прототипы http://sipeksdk.googlecode.com/svn/trun ... pjsipDll.h
Так вроде всё понятно, кроме того, а что передавать ну допустим в onRegStateCallback
Штудируй труды основоположников, например, libcurl ;-)

Что мы имеем в c++

Код: Выделить всё

typedef int __stdcall fptr_regstate(int, int);				// on registration state changed
extern "C" PJSIPDLL_DLL_API int onRegStateCallback(fptr_regstate cb);	  // register registration notifier
Заводим у себя процедурный тип

Код: Выделить всё

fptr_regstate procedure(long, long), long, pascal, type
И объявляем ивент так

Код: Выделить всё

onRegStateCallback procedure(fptr_regstate cb), long, pascal, name('onRegStateCallback ')
и можем передавать в неё любую процедуру с таким же прототипом, что и fptr_regstate.

Вобщем, как-то так.
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

Всё равно чего-то не хватает. Еще ведь нужна процедура? С какими параметрами? Иначе регистрировать то что? Нужен пример более понятный, я до этого процедуры как параметр только в 1С передавал ))
libcurl я посмотрел, там есть что-то похожее, но не совсем то, понятнее не стало
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Event от внешней библиотеки

Сообщение Дед Пахом »

Ну я ж сказал:
Дед Пахом писал(а): и можем передавать в неё любую процедуру с таким же прототипом, что и fptr_regstate.

Код: Выделить всё

  map
my_regstate  procedure(long, long), long, pascal
  end
  
my_regstate  procedure(long, long)
   code
   return 0
   
! ..... где-то в коде
   onRegStateCallback(my_regstate)
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

А тут точно pascal нужен? Не С?
Хотя все равно не работает. Компилится, на сервере регистрируется (лог есть) и закрывается (без видимой ошибки). Если событие не регистрировать, то валится с ошибкой
Руки видимо кривые у меня. Или библиотека
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Event от внешней библиотеки

Сообщение Дед Пахом »

pascal я написал, т.к. увидел stdcall, сам разбирайся в подробностях.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Event от внешней библиотеки

Сообщение Дед Пахом »

надеюсь, ты не 1 в 1 переписал, может быть "return 0" означает завершение работы :idied:
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

Заработало, оказывается нельзя stop ставить внутрь событий )) я ж не знал )
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

Исходящие звонки заработали, я даже удивился
Теперь входящие

Объявляем

Код: Выделить всё

fptr_regstate(long l1, long l2),long,C,type
my_regstate(long l1, long l2),long,C
fptr_callstate(long l1, long l2),long,C,type
my_callstate(long l1, long l2),long,C
fptr_callincoming(long l1, *cstring uri2),long,C,type
my_callincoming(long l1, *cstring uri2),long,C

   MODULE('pjsipdll.dll')
     SIP_init(),LONG,RAW,C,NAME('dll_init')
     SIP_registerAccount(*CSTRING uri, *CSTRING reguri, *CSTRING nam, *CSTRING username, *CSTRING pass, *CSTRING proxy, bool isdefault),LONG,RAW,C,NAME('dll_registerAccount')
     SIP_onRegStateCallback(fptr_regstate cb),long,RAW,C,name('onRegStateCallback')
     SIP_onCallStateCallback(fptr_callstate cb),long,RAW,C,name('onCallStateCallback')
     SIP_onCallIncoming(fptr_callincoming cb),long,RAW,C,name('onCallIncoming')
     SIP_Main(),long,RAW,C,name('dll_Main')
     SIP_makeCall(long accountId, *CSTRING uri),LONG,RAW,C,NAME('dll_makeCall')
   END
Добавляем процедуры

Код: Выделить всё

my_regstate  procedure(LONG l1, LONG l2)
 code
 state1=l1
 state2=l2
 return 0

my_callstate  procedure(LONG l1, LONG l2)
 code
 call1=l1
 call2=l2
 return 0

my_callincoming  procedure(LONG l1, *CSTRING uri2)
 code
 call1=l1
 calluri=uri2
 return 0
Логинимся

Код: Выделить всё

 SIP_onRegStateCallback(my_regstate)
 SIP_onCallStateCallback(my_callstate)
 SIP_onCallIncoming(my_callincoming)
 a#=SIP_init()
 c#=SIP_Main()
 uri='sip:'&clip(username)&'@'&clip(hostname)
 reguri='sip:'&clip(hostname)&':5060;transport=tcp'
 nam='*'
 proxy=''
 isdefault=0
 account=SIP_registerAccount(uri,reguri,nam,username,pass,proxy,isdefault)
Что имеем:
Если прототипы С то на входящем звонке идёт вылет
Если меняю прототипы на Pascal то просто ничего не происходит
calluri, call2 и state2 это глобальные переменные которые выведены на окно которое для простоты обновляется по таймеру
call2 и state2 при логине и исходящем звонке отображаются нормально
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Event от внешней библиотеки

Сообщение Yufil »

Надо ещё глянуть в Help на операторы UnlockThread - LockThread. Когда вызывается сишный модуль, надо предварительно исполнить UnlockThread, а внутри Handler'а - активировать LockThread. Наверное... По крайней мере, в интерфейсе List&Label пришлось....
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

Если строку calluri=uri2 убрать то не вылетает и звонок принять можно, но о нем не известно...
Т.е. проблема с *CSTRING
Еще у кого какие идеи?

Неужели больше никому SIP-звонилка из клариона не нужна?
Последний раз редактировалось RaFaeL 10 Декабрь 2015, 16:57, всего редактировалось 1 раз.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Event от внешней библиотеки

Сообщение Дед Пахом »

RaFaeL писал(а): calluri=uri2
А так:

Код: Выделить всё

calluri=clip(uri2)
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Event от внешней библиотеки

Сообщение RaFaeL »

И так вылетает
Ответить