At (about) line 366 of the ExStrings implementation module the WIN32 versions of the AnsiToUnicode and UnicodeToAnsi procedures are implemented as follows:
PROCEDURE AnsiToUnicode(strA : ARRAY OF ACHAR; VAR OUT strU : ARRAY OF UCHAR);
VAR
l : CARDINAL;
BEGIN
l := LENGTH(strA);
IF WINNLS.MultiByteToWideChar(WINNLS.CP_ACP,
0,
strA, l,
strU, HIGH(strU)+1) = 0
THEN
l := 0;
END;
IF l <= HIGH(strU) THEN
strU[l] := '';
END;
END AnsiToUnicode;
PROCEDURE UnicodeToAnsi(strU : ARRAY OF UCHAR;
VAR OUT strA : ARRAY OF ACHAR;
replaceChar : ACHAR);
VAR
l : CARDINAL;
replaced : BOOL;
BEGIN
l := LENGTH(strU);
IF WINNLS.WideCharToMultiByte(WINNLS.CP_ACP,
0,
strU, l,
strA, HIGH(strA)+1,
replaceChar,
replaced) = 0
THEN
l := 0;
END;
IF l <= HIGH(strA) THEN
strA[l] := '';
END;
END UnicodeToAnsi;
This should be corrected as follows:
PROCEDURE AnsiToUnicode(strA : ARRAY OF ACHAR; VAR OUT strU : ARRAY OF UCHAR);
VAR
l : CARDINAL;
BEGIN
l := WINNLS.MultiByteToWideChar(WINNLS.CP_ACP,
0,
strA, LENGTH(strA),
strU, HIGH(strU)+1);
IF l <= HIGH(strU) THEN
strU[l] := '';
END;
END AnsiToUnicode;
PROCEDURE UnicodeToAnsi(strU : ARRAY OF UCHAR;
VAR OUT strA : ARRAY OF ACHAR;
replaceChar : ACHAR);
VAR
l : CARDINAL;
replaced : BOOL;
BEGIN
l := WINNLS.WideCharToMultiByte(WINNLS.CP_ACP,
0,
strU, LENGTH(strU),
strA, HIGH(strA)+1,
replaceChar,
replaced);
IF l <= HIGH(strA) THEN
strA[l] := '';
END;
END UnicodeToAnsi;