Hello, I modified these two methods. The problem was that Char is no longer 1 byte, but 2 bytes.
The fixes are between "// Start of fix" and "// End of fix".
procedure TWriterThread.WriteToBuffer;
var
i, len, Step: Integer;
Text : String;
begin
Lock;
try
{ If there are no monitors throw out the message
The alternative is to have messages queue up until a
monitor is ready.}
if FMonitorCount^ = 0 then
begin
CS.BeginWrite;
FMsgs.Remove(FMsgs[0]);
CS.EndWrite;
end
else
begin
Text := TTraceObject(FMsgs[0]).FMsg;
i := 1;
len := Length(Text);
while (len > 0) do begin
BeginWrite;
try
FillChar(FBuffer[0], cMaxBufferSize, #0); // Clear the buffer of previous data
FTraceDataType^ := Integer(TTraceObject(FMsgs[0]).FDataType);
FTimeStamp^ := TTraceObject(FMsgs[0]).FTimeStamp;
FBufferSize^ := Min(len * Sizeof(Char), cMaxBufferSize);
Move(Text[i], FBuffer[0], FBufferSize^);
// Start of fix
Step := cMaxBufferSize div SizeOf(Char);
Inc(i, Step); //Inc(i, cMaxBufferSize);
Dec(len, Step); //Dec(len, cMaxBufferSize);
// End of fix
finally
EndWrite;
end;
end;
CS.BeginWrite;
FMsgs.Remove(FMsgs[0]);
CS.EndWrite;
end;
finally
Unlock;
end;
end;
procedure TReaderThread.ReadSQLData;
var
S: String;
BL, CL: Integer;
begin
st.FMsg := ''; {do not localize}
BeginRead;
if not bDone then
try
// Start of fix
//SetString(st.FMsg, FBuffer, FBufferSize^);
BL := FBufferSize^;
SetString(S, FBuffer, BL);
CL := SizeOf(Char);
if CL > 1 then begin
BL := BL div CL;
S := Copy(S, 1, BL);
end;
st.FMsg := S;
// End of fix
st.FDataType := TTraceFlag(FTraceDataType^);
st.FTimeStamp := TDateTime(FTimeStamp^);
finally
EndRead;
end;
end;