<p>Am 14.03.2014 23:46 schrieb "Fred van Stappen" <<a href="mailto:fiens@hotmail.com">fiens@hotmail.com</a>>:<br>
><br>
> > Date: Fri, 14 Mar 2014 23:11:14 +0100<br>
> > From: <a href="mailto:pascaldragon@googlemail.com">pascaldragon@googlemail.com</a><br>
><br>
> > To: <a href="mailto:fpc-pascal@lists.freepascal.org">fpc-pascal@lists.freepascal.org</a><br>
> > Subject: Re: [fpc-pascal] Library.StringFunction() : PChar => NO<br>
> > <br>
> > On 14.03.2014 22:07, Fred van Stappen wrote:<br>
> > > > It's not a problem, as long as you provide an API to dispose the memory<br>
> > > > used by the returned PChar.<br>
> > > > The responsibility of calling this API is delegated<br>
> > > > to the application.<br>
> > ><br>
> > > Yep, with pleasure,... but how to provide an API (and what do you mean<br>
> > > with "provide an API to dispose the memory") ?<br>
> > ><br>
> > > => In short, what must i code to do that ?<br>
> > <br>
> > Inside your library you normally do this when creating a string result:<br>
> > <br>
> > === code begin ===<br>
> > <br>
> > function InLibStringFunction: PChar; // of course declared as cdecl ;)<br>
> > const<br>
> > MyString: AnsiString = 'Hello World'; // this string could also come <br>
> > frome somewhere else in your library<br>
> > begin<br>
> > Result := GetMem(Length(MyString) + 1);<br>
> > Move(@MyString[1], Result, Length(MyString));<br>
> > Result[Length(MyString)] := 0;<br>
> > end;<br>
> > <br>
> > === code end ===<br>
> > <br>
> > Note: if your MyString is valid through the complete lifetime it could <br>
> > be used you can also use "Result := PChar(MyString);" instead, but if <br>
> > your string is e.g. a variable inside the function or a variable inside <br>
> > another function you must copy its content.<br>
> > <br>
> > If you now allocated a PChar using GetMem you add this function as well <br>
> > and export it from the library:<br>
> > <br>
> > === code begin ===<br>
> > <br>
> > procedure InLibFreeString(aStr: PChar);<br>
> > begin<br>
> > FreeMem(aStr);<br>
> > end;<br>
> > <br>
> > === code end ===<br>
> > <br>
> > One could of course now extend the API with additional checks. E.g. so <br>
> > that you know that the string was really allocated by the library and <br>
> > not by e.g. the program using it. But maybe the heap manager already <br>
> > checks this, I don't know currently.<br>
> > <br>
> > Regards,<br>
> > Sven<br>
><br>
> Yep, Sven, excellent and hyper clear.<br>
><br>
> Hum, i think that this code must go somewhere in wiki.<br>
> If you agree i will add it into fpc wiki.</p>
<p>I thought that it was mentioned there somewhere already... If nit feel free to add it. That's what a wiki is good for afterall. ^^</p>
<p>Regards,<br>
Sven</p>