- Код: Выделить всё
- library project1;
 {$mode objfpc}{$H+}
 uses
 Classes { you can add units after this };
 function F1(s: PChar): PChar; cdecl; export;
 begin
 Result := s;
 end;
 exports F1;
 begin
 end.
База данных Firebird 2.5 (UTF8)
В базе данных
- Код: Выделить всё
- DECLARE EXTERNAL FUNCTION TEST
 VARCHAR(255)
 RETURNS VARCHAR(255)
 ENTRY_POINT 'F1' MODULE_NAME 'project1';
Выполняем запрос
- Код: Выделить всё
- SELECT test('ddd') from rdb$database
Результат ПОЛЕ с именем "TEST" и значением "ddd" - т.е. то, что и передали.
Если немного изменить DLL, указав в качестве входного параметра тип дпнных "UTF8String"
- Код: Выделить всё
- function F1(s: UTF8String): PChar; cdecl; export;
 begin
 Result := PChar(s);
 end;
Результата такой же, как и в предыдущем случае.
Однако, если присвоить значение S к коде
- Код: Выделить всё
- function F1(s: UTF8String): PChar; cdecl; export;
 begin
 [b] s:='бла-бла-бла';[/b]
 Result := PChar(s);
 end;
То получается ошибка
- Код: Выделить всё
- /*------ SYSDBA 27.04.2015 21:50:52 --------*/
 /*!!! Ошибка !!!
 Invalid token.
 Malformed string.
 */
И возвращается пустой результат запроса.
Как получить результат запроса (корректный), присвоив значение переменной S в коде?
Т.е. выполнить какие-то действия в коде DLL и отобразить строку запроса.
Добавлено спустя 12 часов 52 минуты 14 секунд:
Вот, получилось.
Пример UDF, которая возвращает строку в MD5
Текст DLL
- Код: Выделить всё
- uses
 Classes,
 md5,
 strings { you can add units after this };
 function MD_5(s: Pchar): PChar; cdecl; export;
 var
 v:UTF8String;
 begin
 v:=strpas(s);
 v:=MD5Print(MD5String(v));
 Result := Pchar(v);
 end;
 exports MD_5;
 {$R *.res}
 begin
 IsMultiThread := True;
 end.
Регистрация в Firebird
- Код: Выделить всё
- DECLARE EXTERNAL FUNCTION TEST
 CSTRING(255)
 RETURNS CSTRING(255)
 ENTRY_POINT 'MD_5' MODULE_NAME 'isd_md5';
Копируем библиотеку в каталог UDF - куда установлен Firebird
Вызов функции
- Код: Выделить всё
- SELECT test('454fgn566') from rdb$database
Результат
- Код: Выделить всё
- 127406ffefd4b224e2a79b7e754ab388
В принципе то, что и ожидалось.


