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

Clarion, Clarion 7

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

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

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

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

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

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

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

не, не вариант, для memcpy нужен размер строки. Может так?

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

slen long, auto
saddr long, auto
  slen = len(url2)
  saddr = address(url2)
  memcpy(address(callurl), saddr, slen)
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

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

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

а хотя... с прототипом "long url2":

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

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

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

Сообщение RaFaeL »

Через указатель валится уже на sref &= (url2)
Просто через memcpy работает, но действительно нужна длина. Т.е. если взять например 80 то будет с запасом и по шаблону лишнее обрезать. Насколько вероятность большая что это приведет к чему-то неприятному?
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

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

Сообщение RaFaeL »

Вот так работает

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

my_callincoming  procedure(LONG l1, long uri2)
 code
 call1=l1
 calllong=uri2
 slen = strlen(uri2)
 memcpy(address(calluri), calllong, slen)
 return 0
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

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

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

Сообщение RaFaeL »

Сделал так, упростило код но фрагменту со строкой не помогло )) Оставлю пока через strlen
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

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

Сообщение RaFaeL »

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