Russian Qt Forum
Ноябрь 24, 2024, 04:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Qt работа с UDF  (Прочитано 16605 раз)
Zmeishe
Гость
« Ответ #15 : Октябрь 20, 2009, 16:13 »

Переменная типа QByteArray это локальная переменная внутри твоей функции.
После return указатель data.data() уже мертв!

Где ты видел, чтобы локальные переменные так возвращали.

Но это к делу не относится.
Я не понимаю, почему Firebird  не может с твоими DLL работать.
Такое ощущение, что у твоей DLL есть ещё какие-то зависимости от других DLL и Firebird не имеет к ним доступа.

Как собрана Qt и чем она собрана ?
« Последнее редактирование: Октябрь 20, 2009, 16:21 от Zmeishe » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #16 : Октябрь 20, 2009, 16:23 »

Из другой софтины функция находиться, а из базы нет?

Именно, это меня и пугает.

все зависимости есть в TotalCommander
Код:
kernel32.dll
mingw10.dll
msvctrl.dll
QtCore4.dll
Записан
BRE
Гость
« Ответ #17 : Октябрь 20, 2009, 16:25 »

Именно, это меня и пугает.
А как из FB ее дергаешь, может там что не так.
Записан
Zmeishe
Гость
« Ответ #18 : Октябрь 20, 2009, 16:27 »

PATH к mingw10.dll прописан? Firebird до неё может достучаться?
Записан
Tonal
Гость
« Ответ #19 : Октябрь 21, 2009, 08:26 »

Посмотри Filemon-ом чё дёргается серверо мри попытке вызвать UDF-ку.
Похоже каких-то dll-ек не находит.
Ну и сообщение сервера об ошибке надо бы привести, однако. Улыбающийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #20 : Октябрь 21, 2009, 10:59 »

Вот скрин ошибки
http://pic.ipicture.ru/uploads/091021/OOknhxNixD.jpg

Цитировать
PATH к mingw10.dll прописан?
Да

Цитировать
Firebird до неё может достучаться?

Не знаю как посмотреть

Цитировать
А как из FB ее дергаешь, может там что не так.

пробую реализовать пример Zmeishe
Код:
extern "C" __declspec(dllexport) char* uid()
{
  char *p;

  p = QUuid::createUuid().toString().toAscii().data();
  return p;
}

в Firebird декларирую вот так
Код:
DECLARE EXTERNAL FUNCTION UDF
  RETURNS CSTRING(254)
  ENTRY_POINT 'uid'
  MODULE_NAME 'crqphudf'

Вызываю так
Код:
select UDF() from Object

получаю ошибку выше, в место Filemon, скачал Process Monitor ибо у меня Vista, пока с ним разбираюсь.


Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #21 : Октябрь 21, 2009, 11:37 »

вот что мне говорит Process Monitor http://pic.ipicture.ru/uploads/091021/0oHA6pj07X.jpg
Записан
Zmeishe
Гость
« Ответ #22 : Октябрь 21, 2009, 11:51 »

У тебя там два модуля(файла) ? Один с расширением dll, другой без ?
Я правильно понял? Или это Process Monitor так показывает?

Убей тот, который без расширения.
« Последнее редактирование: Октябрь 21, 2009, 11:53 от Zmeishe » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #23 : Октябрь 21, 2009, 12:20 »

Модуль там один тот который с расширением dll.

Я думаю что в Firebird декларация идет как "crqphudf" вот он наверное и ищет сначала с без "dll" потом с "dll"
Записан
Zmeishe
Гость
« Ответ #24 : Октябрь 21, 2009, 12:47 »

А чем вызываешь
select UDF() from Object
??

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #25 : Октябрь 21, 2009, 13:58 »

Сначала через IBExpert ,а сейчас через Interbase&Firebird Development Studio ошибка одна и та же. Firebird 2.1.3
Записан
Zmeishe
Гость
« Ответ #26 : Октябрь 21, 2009, 14:16 »

Как же у тебя работал пример с udf, который с числами и функцией qRound64()  Непонимающий
Если бы он не работал, я бы решил, что дело в компиляторе.
А так, даже не знаю.
Должно работать - у меня работает независимо от платформы Linux/Windows.
Только я НЕ на Vista, а XP проверял.

PS:
1 декабря 2009 г. будет ровно год, как я в Windows заходил последний раз.
Linux мне больше понравился.
« Последнее редактирование: Октябрь 21, 2009, 14:20 от Zmeishe » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #27 : Октябрь 21, 2009, 15:05 »

офф.
Цитировать
1 декабря 2009 г. будет ровно год, как я в Windows заходил последний раз.

И у меня день рождение Улыбающийся

В общем насколько я понял пример с числами работал потому что, компилятор не собирал либы или может еше что то что использует строки, ибо пример с числами весит 5кб а со строками 21кб,  если чесно я сам ничего понять не могу, хотелось использовать Qt в udf ибо проще ,а получилось сложнее Улыбающийся Я просто написал свою реализацию алгоритмов шифрования, ибо все таки если использовать просто char* то все работает. Если есть еше какие соображения пишите буду признателен, если сам разберусь обязательно отпишу в Wiki.

Есть еше вопрос тоже оффтопом

При декларировании функции в Firebird необходимо указывать тип возвращаемого значения я указываю Cstring(255) а если строка будет длиннее то что тогда я же заранее не знаю размер строки как лучше задекларировать в этом случае?
Записан
Zmeishe
Гость
« Ответ #28 : Октябрь 21, 2009, 15:20 »

Цитата: ecspertiza
пример с числами работал потому что, компилятор не собирал либы или может еше что то что использует строки
В моём примере qRound64() использует то же, что QString - QtCore4.dll
И если udf c qRound64() работает, т.е. все модули и точки входа FB находит, значит и с QString работать должен - разницы никакой.
Либо дело в связке FB + Vista.


Цитата: ecspertiza
а если строка будет длиннее то что тогда я же заранее не знаю размер строки как лучше задекларировать в этом случае?
Насколько я помню, в IB/FB можно задать большую длину строки 32000 или даже 64000.

Если этого мало - тогда юзай тип BLOB.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 23.