On 14 Feb 2014, at 20:28, Fred van Stappen wrote:

> >What I have been wondering for some time now (perhaps you wrote it in a
> >mail and I missed it): do you use the same memory manager in the library
> >and in your test program?
> 
> Oops, indeed i forget that point...
> The test now are with cmem only in program, not in library.
> 
> I will test with cmem into library too...

That that is issue number 1: if your program wants to free something that your 
library allocated, both operations need to be done by the same memory manager.

> 
> >The example here might be extremely over-simplified, but replace
> > `a: Integer` with `mystring: String` and we're roughly at your example.
> 
> Hum, absolutely, it is the same example... 
> So, how must i do to use PChar ?

The way I use to pass strings from C/C++ libraries is to allocate a buffer, 
copy the contents of the string into the buffer and return the pointer to that 
buffer. The same method can be used here. Also don't forget to provide a second 
function to free these buffers (in this way your library can have a different 
memory manager than your application).

So you might try something along the lines of:

Function ConvertToPChar(str: String): PChar;
Begin
        Result:= Getmem(Length(str) + 1);       // Allocating the buffer 
somewhere on the heap

        If Length(str) > 0 Then
                Move(str[1], Result[0], Length(str));   // The content
        
        Result[l]Length(str)]:= #0;     // The null termination
End;

..., where I decided to return `standard` null-terminated strings, since your 
library is meant to be `universal`.

Next, the procedure to free buffers using the memory manager of the library:

Procedure FreeBuffer(Buffer: Pointer);
Begin
        FreeMem(Buffer);
End;

That's it for the library part. In your program part, don't forget to free 
these buffers once they are no longer needed.

Also note that this is a good approach with respect to `universiality`, but if 
you need to pass a lot of strings to and fro you would be better off with a 
more pascalish version. The thing that comes to mind here is providing a 
function in your library that replaces the current memory manager with the one 
passed to it as an argument. This would allow you to simply return a string.

--
Ewald

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to