> Date: Fri, 14 Mar 2014 23:11:14 +0100
> From: [email protected]
> To: [email protected]
> Subject: Re: [fpc-pascal] Library.StringFunction() : PChar => NO
>
> 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
Yep, Sven, excellent and hyper clear.
Hum, i think that this code must go somewhere in wiki.
If you agree i will add it into fpc wiki.
Many thanks.
Fred.
_______________________________________________
fpc-pascal maillist - [email protected]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal