Firebird, UDF, returns cstring, free_it, Access violation

01/08/2009 - 13:57 von Hubert Seidel | Report spam
Hallo NG,

ich habe mit meinen ersten Gehversuchen mit UDFs
in Firebird eine funktionierende Access violation.

Dazu der wohl entscheidende Hinweis aus dem Log:

The user defined function: F_TESTSTRINGCOPY1
referencing entrypoint: TESTSTRINGCOPY1
in module: UdfFirst.dll
caused the fatal exception: Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.

...\Firebird_2_1\bin\fbserver.exe": terminated abnormally (4294967295)
(4294967295 ist wohl FFFFFFFF bzw. -1, also nicht wirklich verwertbar)

Hier die Funktion (es ist auch keine andere
bisher installiert/konfiguriert worder):

function TestStringCopy1(aPc:PChar):PChar; cdecl;
var
MemRes:integer;
begin
MemRes:=Length(aPc)+1;// Ein mehr für das Null-Zeichen //
Result := malloc(MemRes);
Move(aPc^, Result^, MemRes);
end;

zuzuglich folgende Informationen:

initialization
IsMultiThread := True;
(Damit sollte ja theoretisch Multithreading sicher gestellt sein)

Natürlich noch die Einbindung:
declare external function f_TestStringCopy1
cstring(20)
returns cstring(20) free_it
entry_point 'TESTSTRINGCOPY1' module_name 'UdfFirst.dll'
;

Ich kann nun fehlerfrei genau 4 mal
select f_TestStringCopy1('Hello World!') from rdb$database;
aufrufen, und beim fünften mal "raucht Firebird ab" :-(

Liegt das evtl. am malloc?
oder hat jemand eine bessere Idee?

mfg.
Herby

http://www.hubert-seidel.eu
 

Lesen sie die antworten

#1 Hubert Seidel
01/08/2009 - 14:31 | Warnen spam
Hallo NG,

ich habs nun heraus bekommen :-))

Es lag tatsàchlich am malloc...
Korrekr ist es ib_util_malloc aus ib_util zu verwenden!

"Hubert Seidel" schrieb
im Newsbeitrag news:h519ni$8d8$02$

Korrektur also wie folgt:

uses
ib_util,
...

function TestStringCopy1(aPc:PChar):PChar; cdecl;
var
MemRes:integer;
begin
MemRes:=Length(aPc)+1;// Ein mehr für das Null-Zeichen //


Result := ib_util_malloc(MemRes); // <=#### Unbedingt beachten!!
Move(aPc^, Result^, MemRes);
end;



mfg.
Herby

http://www.hubert-seidel.eu

Ähnliche fragen