Страница 2 из 2

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

Добавлено: 10 Декабрь 2015, 17:04
Дед Пахом
я бы заменил *cstring uri2 в прототипе на long url2, и юзал memcpy. Подозреваю, что невозможность объявить атрибут RAW у клашиной процедуры здесь как раз узкое место.

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

Добавлено: 10 Декабрь 2015, 17:21
Дед Пахом
не, не вариант, для memcpy нужен размер строки. Может так?

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

slen long, auto
saddr long, auto
  slen = len(url2)
  saddr = address(url2)
  memcpy(address(callurl), saddr, slen)

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

Добавлено: 10 Декабрь 2015, 17:25
Дед Пахом
а хотя... с прототипом "long url2":

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

sref &cstring
  sref &= (url2)
  slen = len(sref)
  memcpy(address(callurl), url2, slen)

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

Добавлено: 10 Декабрь 2015, 17:53
RaFaeL
Через указатель валится уже на sref &= (url2)
Просто через memcpy работает, но действительно нужна длина. Т.е. если взять например 80 то будет с запасом и по шаблону лишнее обрезать. Насколько вероятность большая что это приведет к чему-то неприятному?

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

Добавлено: 10 Декабрь 2015, 22:02
RaFaeL
Вот так работает

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

my_callincoming  procedure(LONG l1, long uri2)
 code
 call1=l1
 calllong=uri2
 slen = strlen(uri2)
 memcpy(address(calluri), calllong, slen)
 return 0

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

Добавлено: 10 Декабрь 2015, 22:27
Yufil
Попробуй вместо процедур передавать их адреса.

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

     SIP_onRegStateCallback(Long),Long,RAW,C,name('onRegStateCallback')
     SIP_onCallStateCallback(Long),long,RAW,C,name('onCallStateCallback')
... 
 SIP_onRegStateCallback(ADDRESS(my_regstate))
 SIP_onCallStateCallback(ADDRESS(my_callstate))
 SIP_onCallIncoming(ADDRESS(my_callincoming)) 

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

Добавлено: 10 Декабрь 2015, 23:12
RaFaeL
Сделал так, упростило код но фрагменту со строкой не помогло )) Оставлю пока через strlen

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

Добавлено: 11 Декабрь 2015, 10:19
Yufil
Там могут быть проблемы с управлением памятью, в том числе и для строк.
Перед вызовом программы на сях надо вызвать Unlockthread, а внутри обработчика сначала сказать Lockthread, а на выходе снова Unlockthread, может быть, после этого и прокатит. Или не...

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

Добавлено: 11 Декабрь 2015, 11:55
RaFaeL
Выяснил, что внутри обработчика не работают никакие кларионовские процедуры (кроме присваивания переменных), сразу вылет. При этом strlen и memcpy работают