[fpc-pascal] Library.StringFunction() : PChar => NO
Sven Barth
pascaldragon at googlemail.com
Fri Mar 14 23:11:14 CET 2014
On 14.03.2014 22:07, Fred van Stappen wrote:
> > It's not a problem, as long as you provide an API to dispose the memory
> > used by the returned PChar.
> > The responsibility of calling this API is delegated
> > to the application.
>
> Yep, with pleasure,... but how to provide an API (and what do you mean
> with "provide an API to dispose the memory") ?
>
> => In short, what must i code to do that ?
Inside your library you normally do this when creating a string result:
=== code begin ===
function InLibStringFunction: PChar; // of course declared as cdecl ;)
const
MyString: AnsiString = 'Hello World'; // this string could also come
frome somewhere else in your library
begin
Result := GetMem(Length(MyString) + 1);
Move(@MyString[1], Result, Length(MyString));
Result[Length(MyString)] := 0;
end;
=== code end ===
Note: if your MyString is valid through the complete lifetime it could
be used you can also use "Result := PChar(MyString);" instead, but if
your string is e.g. a variable inside the function or a variable inside
another function you must copy its content.
If you now allocated a PChar using GetMem you add this function as well
and export it from the library:
=== code begin ===
procedure InLibFreeString(aStr: PChar);
begin
FreeMem(aStr);
end;
=== code end ===
One could of course now extend the API with additional checks. E.g. so
that you know that the string was really allocated by the library and
not by e.g. the program using it. But maybe the heap manager already
checks this, I don't know currently.
Regards,
Sven
More information about the fpc-pascal
mailing list