* Fixed Wide<->Ansi conversion for wince.

git-svn-id: trunk@10725 -
This commit is contained in:
yury 2008-04-19 21:52:12 +00:00
parent b64519162d
commit 10a286532f
3 changed files with 31 additions and 28 deletions

View File

@ -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; function WideCharToMultiByte(CodePage:UINT; dwFlags:DWORD; lpWideCharStr:PWideChar; cchWideChar:longint; lpMultiByteStr:PChar;cchMultiByte:longint; lpDefaultChar:PChar; lpUsedDefaultChar:pointer):longint;
cdecl; external 'coredll' name 'WideCharToMultiByte'; 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; function AnsiToWideBuf(AnsiBuf: PChar; AnsiBufLen: longint; WideBuf: PWideChar; WideBufLen: longint): longint;
begin begin
Result := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, AnsiBuf, AnsiBufLen, WideBuf, WideBufLen div SizeOf(WideChar)); Result := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, AnsiBuf, AnsiBufLen, WideBuf, WideBufLen div SizeOf(WideChar));
@ -328,12 +329,12 @@ begin
exit; exit;
end; end;
WideBuf[Result] := #0; WideBuf[Result] := #0;
if (Result <> 0) or (AnsiBufLen = 0) then
Inc(Result);
end; end;
Result:=Result*SizeOf(WideChar); if (AnsiBufLen <> -1) and ((Result <> 0) or (AnsiBufLen = 0)) then
Inc(Result);
end; end;
{ Returns number of characters stored to AnsiBuf, including null-terminator. }
function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint; function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint;
begin begin
Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideCharsLen, AnsiBuf, AnsiBufLen, nil, nil); Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideCharsLen, AnsiBuf, AnsiBufLen, nil, nil);
@ -346,18 +347,20 @@ begin
exit; exit;
end; end;
AnsiBuf[Result] := #0; AnsiBuf[Result] := #0;
if (Result <> 0) or (WideCharsLen = 0) then
Inc(Result);
end; end;
if (WideCharsLen <> -1) and ((Result <> 0) or (WideCharsLen = 0)) then
Inc(Result);
end; 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; function PCharToPWideChar(str: PChar; strlen: longint = -1; outlen: PLongInt = nil): PWideChar;
var var
len: longint; len: longint;
begin begin
while True do begin while True do begin
if strlen <> -1 then if strlen <> -1 then
len:=(strlen + 1) len:=strlen + 1
else else
len:=AnsiToWideBuf(str, -1, nil, 0); len:=AnsiToWideBuf(str, -1, nil, 0);
if len > 0 then if len > 0 then
@ -374,15 +377,17 @@ begin
end end
else begin else begin
GetMem(Result, SizeOf(WideChar)); GetMem(Result, SizeOf(WideChar));
Inc(len, 2); len:=1;
Result^:=#0; Result^:=#0;
end; end;
break; break;
end; end;
if outlen <> nil then if outlen <> nil then
outlen^:=len - SizeOf(WideChar); outlen^:=len;
end; 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; function StringToPWideChar(const s: AnsiString; outlen: PLongInt = nil): PWideChar;
var var
len, wlen: longint; len, wlen: longint;
@ -390,14 +395,14 @@ begin
len:=Length(s); len:=Length(s);
wlen:=(len + 1)*SizeOf(WideChar); wlen:=(len + 1)*SizeOf(WideChar);
GetMem(Result, wlen); GetMem(Result, wlen);
wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen); wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar);
if wlen = 0 then if wlen = 0 then
begin begin
wlen:=AnsiToWideBuf(PChar(s), len, nil, 0); wlen:=AnsiToWideBuf(PChar(s), len, nil, 0)*SizeOf(WideChar);
if wlen > 0 then if wlen > 0 then
begin begin
ReAllocMem(Result, wlen); ReAllocMem(Result, wlen);
wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen); wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar);
end end
else else
begin begin
@ -406,7 +411,7 @@ begin
end; end;
end; end;
if outlen <> nil then if outlen <> nil then
outlen^:=(wlen - 1) div SizeOf(WideChar); outlen^:=wlen div SizeOf(WideChar);
end; end;
{***************************************************************************** {*****************************************************************************

View File

@ -68,7 +68,7 @@ procedure PWideCharToString(const str: PWideChar; out Result: string; strlen: lo
var var
len: longint; len: longint;
begin begin
if str^ = #0 then if (strlen < 1) and (str^ = #0) then
Result:='' Result:=''
else else
begin begin
@ -803,8 +803,8 @@ begin
if s <> '' then if s <> '' then
begin begin
buf:=StringToPWideChar(s, @len); buf:=StringToPWideChar(s, @len);
CharUpperBuff(buf, len); CharUpperBuff(buf, len-1);
PWideCharToString(buf, Result, len); PWideCharToString(buf, Result, len-1);
FreeMem(buf); FreeMem(buf);
end end
else else
@ -820,8 +820,8 @@ begin
if s <> '' then if s <> '' then
begin begin
buf:=StringToPWideChar(s, @len); buf:=StringToPWideChar(s, @len);
CharLowerBuff(buf, len); CharLowerBuff(buf, len-1);
PWideCharToString(buf, Result, len); PWideCharToString(buf, Result, len-1);
FreeMem(buf); FreeMem(buf);
end end
else else
@ -883,7 +883,7 @@ var
begin begin
ws1:=PCharToPWideChar(S1, MaxLen, @len1); ws1:=PCharToPWideChar(S1, MaxLen, @len1);
ws2:=PCharToPWideChar(S2, MaxLen, @len2); 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(ws2);
FreeMem(ws1); FreeMem(ws1);
end; end;
@ -896,7 +896,7 @@ var
begin begin
ws1:=PCharToPWideChar(S1, MaxLen, @len1); ws1:=PCharToPWideChar(S1, MaxLen, @len1);
ws2:=PCharToPWideChar(S2, MaxLen, @len2); 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(ws2);
FreeMem(ws1); FreeMem(ws1);
end; end;
@ -908,10 +908,9 @@ var
len: longint; len: longint;
begin begin
buf:=PCharToPWideChar(Str, -1, @len); buf:=PCharToPWideChar(Str, -1, @len);
len:=len div SizeOf(WideChar); CharLowerBuff(buf, len - 1);
CharLowerBuff(buf, len);
Result:=Str; Result:=Str;
WideToAnsiBuf(buf, -1, Result, len + 1); WideToAnsiBuf(buf, -1, Result, StrLen(Str));
FreeMem(buf); FreeMem(buf);
end; end;
@ -922,10 +921,9 @@ var
len: longint; len: longint;
begin begin
buf:=PCharToPWideChar(Str, -1, @len); buf:=PCharToPWideChar(Str, -1, @len);
len:=len div SizeOf(WideChar); CharUpperBuff(buf, len - 1);
CharUpperBuff(buf, len);
Result:=Str; Result:=Str;
WideToAnsiBuf(buf, -1, Result, len + 1); WideToAnsiBuf(buf, -1, Result, StrLen(Str));
FreeMem(buf); FreeMem(buf);
end; end;

View File

@ -205,10 +205,10 @@ var
begin begin
lpwsValueName:=PCharToPWideChar(lpValueName); lpwsValueName:=PCharToPWideChar(lpValueName);
if dwType in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin 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); ws:=PCharToPWideChar(lpData, cbData, @sz);
if (cbData > 0) and (PChar(lpData)[cbData - 1] <> #0) then cbData:=sz*SizeOf(WideChar);
Inc(sz, SizeOf(WideChar));
cbData:=sz;
DataBuf:=ws; DataBuf:=ws;
end end
else begin else begin