<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>> Date: Fri, 14 Mar 2014 23:11:14 +0100<br><div>> From: pascaldragon@googlemail.com<br>> To: fpc-pascal@lists.freepascal.org<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.<br><br>Many thanks.<br><br>Fred.<br></div>                                         </div></body>
</html>