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

Firebird 2.0 RC3 и UDF

Добавлено: 02 авг 2006, 13:40
CyberMax
Функция (взята для примера из "Мира IB"):

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

library my_udf;

uses
  SysUtils;

function malloc(Size: Integer): Pointer; cdecl; external 'msvcrt.dll';

function StrUpperCase(sz1: PChar): PChar; cdecl; export;
var
  S: string;
begin
  S := AnsiUpperCase(sz1);
  Result := malloc(Length(S) + 1);
  StrPCopy(Result, S);
end;

exports
  StrUpperCase;

begin
end.
регистрация:

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

DECLARE EXTERNAL FUNCTION FN_UPPER_CASE
    CSTRING(200)
RETURNS CSTRING(200) FREE_IT
ENTRY_POINT 'StrUpperCase' MODULE_NAME 'my_udf'
Запрос:

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

SELECT
    FN_UPPER_CASE('qwe')
FROM
    RDB$DATABASE
После шестого запуска сервер всегда слетает. На RC2 то же самое работает без проблем.

Добавлено: 02 авг 2006, 15:34
hvlad
malloc не катит

Добавлено: 02 авг 2006, 15:41
CyberMax
1. Неужели настолько значительные изменения по сравнению с RC2?
2. Почему не катит?
3. Тогда чем память резервировать?

Добавлено: 02 авг 2006, 15:57
hvlad
Код, работающий с УДФ не менялся с момента 2-ой беты.
Вообще-то, есть ib_util.dll
FB2 использует msvcr71.dll, а не msvcrt.dll

Добавлено: 02 авг 2006, 16:17
CyberMax
Ёпт, этот "Мир IB" меня уже в который раз подводит :evil:. При использовании ib_util_malloc все работает корректно.
Кстати, по поводу второго кандидата. Дома стоял еще RC2. На нем malloc отработал без проблем. При установке RC3 воспроизвелась эта ситуация. Сейчас опять вернул RC2, а слет сервера остался. Хотя это уже совсем неважно.