On 16-09-2011 20:20, Arno Garrels wrote:
As far as I read this thread the OP uses a non-Unicode Delphi version.
So "string" maps to AnsiString. Any assignment of an AnsiString to a
WideString leads to an implicit string cast to Unicode (Win API
WideCharToMultiByte) internally, that's one of the compiler 'magics'
included in Delphi. Converting from Ansi to Unicode and back again to
Ansi however doesn't work reliable with arbitrary binary data but only
with pure _textual data, it depends on the current Ansi codepage
whether or not some non-printable chars are converted back and forth
without data loss.
I see. The idea is the usage of the widestring just as a easy way to
call the, behind the scene, SysAllocString and SysFreeString, that we
need in this case. But we can always treat it as a buffer, setting its
length, and moving data, explicitly, without casting.
One could, i.e., make sure that the recieved string length doesn't
exceed a maximum and use a single call with a constant sized buffer
in order to avoid double calls.
That would work too, and it's probably the better choice, if the
function gets called many times. Allocate once, use many times.
And if a EnterCriticalSection is being used, I suppose it is because
the data can change, so there is the potential the first call to get
size is no longer valid when requesting the data itself.
I think I mentioned that, no?
Sorry, my fault. I missed to scroll your reply till the end. I stopped
in the code sample :-(
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