Adam Burgoyne wrote:
> I've now changed the
> code to this which should solve the problem if I understood correctly:
>
> function ReadMessage: PAnsiChar; stdcall;
> var
> Note: AnsiString;
> begin
> EnterCriticalSection(CritSectn);
>
> if (NotesList.Count > 0) then
> begin
> Note := NotesList.Strings[0];
> NotesList.Delete(0);
> Result := PAnsiChar(Note);
> end
> else
> Result := '';
>
> LeaveCriticalSection(CritSectn);
> end;
That doesn't work either, the string assigned to the local variable is
destroyed when it goes out of scope, that is when the function is left.
You have to change the function like below and have the caller allocate
and free the memory the string is copied to:
{code untested}
function ReadMessage(pBuf: PAnsiChar; pBufSize: PLongWord): LongWord; stdcall;
begin
try
EnterCriticalSection(CritSectn);
try
if pBufSize = nil then
begin
Result := 0;
end
else if pBuf = nil then
begin // Return required size / number of AnsiChars
pBufSize^ := Length(NotesList[0]);
Result := 0;
end
else if pBufSize^ < Length(NotesList[0]) then
begin // Return required size / number of AnsiChars
pBufSize^ := Length(NotesList[0]);
Result := 0;
end
else begin // Return number of copied AnsiChars
Result := Length(NotesList[0]);
Move(Pointer(NotesList[0])^, pBuf^, Result);
NotesList.Delete(0);
end;
finally
LeaveCriticalSection(CritSectn);
end;
except
Result := 0;
end;
end;
{code}
But..
If that function is called from different threads you cannot
use it to get the size of a string in a first call with a nil
pBuf since on the second call the string might no longer be
the same.
--
Arno Garrels
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be