diff --git a/rtl/wince/system.pp b/rtl/wince/system.pp index b15628ecd4..e99d9814f3 100644 --- a/rtl/wince/system.pp +++ b/rtl/wince/system.pp @@ -316,6 +316,7 @@ function MultiByteToWideChar(CodePage:UINT; dwFlags:DWORD; lpMultiByteStr:PChar; function WideCharToMultiByte(CodePage:UINT; dwFlags:DWORD; lpWideCharStr:PWideChar; cchWideChar:longint; lpMultiByteStr:PChar;cchMultiByte:longint; lpDefaultChar:PChar; lpUsedDefaultChar:pointer):longint; cdecl; external 'coredll' name 'WideCharToMultiByte'; +{ Returns number of characters stored to WideBuf, including null-terminator. } function AnsiToWideBuf(AnsiBuf: PChar; AnsiBufLen: longint; WideBuf: PWideChar; WideBufLen: longint): longint; begin Result := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, AnsiBuf, AnsiBufLen, WideBuf, WideBufLen div SizeOf(WideChar)); @@ -328,12 +329,12 @@ begin exit; end; WideBuf[Result] := #0; - if (Result <> 0) or (AnsiBufLen = 0) then - Inc(Result); end; - Result:=Result*SizeOf(WideChar); + if (AnsiBufLen <> -1) and ((Result <> 0) or (AnsiBufLen = 0)) then + Inc(Result); end; +{ Returns number of characters stored to AnsiBuf, including null-terminator. } function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint; begin Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideCharsLen, AnsiBuf, AnsiBufLen, nil, nil); @@ -346,18 +347,20 @@ begin exit; end; AnsiBuf[Result] := #0; - if (Result <> 0) or (WideCharsLen = 0) then - Inc(Result); end; + if (WideCharsLen <> -1) and ((Result <> 0) or (WideCharsLen = 0)) then + Inc(Result); end; +{ Returns dynamic memory block, which contains wide string. This memory should be freed using FreeMem. } +{ outlen will contain number of wide characters stored to result buffer, including null-terminator. } function PCharToPWideChar(str: PChar; strlen: longint = -1; outlen: PLongInt = nil): PWideChar; var len: longint; begin while True do begin if strlen <> -1 then - len:=(strlen + 1) + len:=strlen + 1 else len:=AnsiToWideBuf(str, -1, nil, 0); if len > 0 then @@ -374,15 +377,17 @@ begin end else begin GetMem(Result, SizeOf(WideChar)); - Inc(len, 2); + len:=1; Result^:=#0; end; break; end; if outlen <> nil then - outlen^:=len - SizeOf(WideChar); + outlen^:=len; end; +{ Returns dynamic memory block, which contains wide string. This memory should be freed using FreeMem. } +{ outlen will contain number of wide characters stored to result buffer, including null-terminator. } function StringToPWideChar(const s: AnsiString; outlen: PLongInt = nil): PWideChar; var len, wlen: longint; @@ -390,14 +395,14 @@ begin len:=Length(s); wlen:=(len + 1)*SizeOf(WideChar); GetMem(Result, wlen); - wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen); + wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar); if wlen = 0 then begin - wlen:=AnsiToWideBuf(PChar(s), len, nil, 0); + wlen:=AnsiToWideBuf(PChar(s), len, nil, 0)*SizeOf(WideChar); if wlen > 0 then begin ReAllocMem(Result, wlen); - wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen); + wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar); end else begin @@ -406,7 +411,7 @@ begin end; end; if outlen <> nil then - outlen^:=(wlen - 1) div SizeOf(WideChar); + outlen^:=wlen div SizeOf(WideChar); end; {***************************************************************************** diff --git a/rtl/wince/sysutils.pp b/rtl/wince/sysutils.pp index c080bd4172..17425c9a21 100644 --- a/rtl/wince/sysutils.pp +++ b/rtl/wince/sysutils.pp @@ -68,7 +68,7 @@ procedure PWideCharToString(const str: PWideChar; out Result: string; strlen: lo var len: longint; begin - if str^ = #0 then + if (strlen < 1) and (str^ = #0) then Result:='' else begin @@ -803,8 +803,8 @@ begin if s <> '' then begin buf:=StringToPWideChar(s, @len); - CharUpperBuff(buf, len); - PWideCharToString(buf, Result, len); + CharUpperBuff(buf, len-1); + PWideCharToString(buf, Result, len-1); FreeMem(buf); end else @@ -820,8 +820,8 @@ begin if s <> '' then begin buf:=StringToPWideChar(s, @len); - CharLowerBuff(buf, len); - PWideCharToString(buf, Result, len); + CharLowerBuff(buf, len-1); + PWideCharToString(buf, Result, len-1); FreeMem(buf); end else @@ -883,7 +883,7 @@ var begin ws1:=PCharToPWideChar(S1, MaxLen, @len1); ws2:=PCharToPWideChar(S2, MaxLen, @len2); - Result:=CompareString(LOCALE_USER_DEFAULT, 0, ws1, len1 div SizeOf(WideChar), ws2, len2 div SizeOf(WideChar)) - 2; + Result:=CompareString(LOCALE_USER_DEFAULT, 0, ws1, len1, ws2, len2) - 2; FreeMem(ws2); FreeMem(ws1); end; @@ -896,7 +896,7 @@ var begin ws1:=PCharToPWideChar(S1, MaxLen, @len1); ws2:=PCharToPWideChar(S2, MaxLen, @len2); - Result:=CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, ws1, len1 div SizeOf(WideChar), ws2, len2 div SizeOf(WideChar)) - 2; + Result:=CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, ws1, len1, ws2, len2) - 2; FreeMem(ws2); FreeMem(ws1); end; @@ -908,10 +908,9 @@ var len: longint; begin buf:=PCharToPWideChar(Str, -1, @len); - len:=len div SizeOf(WideChar); - CharLowerBuff(buf, len); + CharLowerBuff(buf, len - 1); Result:=Str; - WideToAnsiBuf(buf, -1, Result, len + 1); + WideToAnsiBuf(buf, -1, Result, StrLen(Str)); FreeMem(buf); end; @@ -922,10 +921,9 @@ var len: longint; begin buf:=PCharToPWideChar(Str, -1, @len); - len:=len div SizeOf(WideChar); - CharUpperBuff(buf, len); + CharUpperBuff(buf, len - 1); Result:=Str; - WideToAnsiBuf(buf, -1, Result, len + 1); + WideToAnsiBuf(buf, -1, Result, StrLen(Str)); FreeMem(buf); end; diff --git a/rtl/wince/wininc/cemiss.inc b/rtl/wince/wininc/cemiss.inc index 02fe37edf9..c510e9131b 100644 --- a/rtl/wince/wininc/cemiss.inc +++ b/rtl/wince/wininc/cemiss.inc @@ -205,10 +205,10 @@ var begin lpwsValueName:=PCharToPWideChar(lpValueName); if dwType in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin + if (cbData > 0) and (PChar(lpData)[cbData - 1] = #0) then + Dec(cbData); ws:=PCharToPWideChar(lpData, cbData, @sz); - if (cbData > 0) and (PChar(lpData)[cbData - 1] <> #0) then - Inc(sz, SizeOf(WideChar)); - cbData:=sz; + cbData:=sz*SizeOf(WideChar); DataBuf:=ws; end else begin