- Код: Выделить всё
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
В принципе то, что и ожидалось.