diff options
author | yury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-08-22 22:27:41 +0000 |
---|---|---|
committer | yury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2007-08-22 22:27:41 +0000 |
commit | 465282a38c3e39d9beb84dcdd9b230a93a4c6343 (patch) | |
tree | ee41fe804d552a8e211c1f5fba8e9c1f176b81be | |
parent | cdbff2dd799515d24d2a10734eaf09f73075f644 (diff) | |
download | fpc-465282a38c3e39d9beb84dcdd9b230a93a4c6343.tar.gz |
Merged revisions 8300-8301 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk
........
r8300 | yury | 2007-08-23 01:13:07 +0300 (Чт, 23 авг 2007) | 1 line
* Fixed internal Ansi<->Wide conversion routines.
........
r8301 | yury | 2007-08-23 01:13:59 +0300 (Чт, 23 авг 2007) | 1 line
* Properly implement registry API ANSI wrappers for wince.
........
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/fixes_2_2@8302 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | rtl/wince/system.pp | 16 | ||||
-rw-r--r-- | rtl/wince/wininc/cemiss.inc | 132 |
2 files changed, 122 insertions, 26 deletions
diff --git a/rtl/wince/system.pp b/rtl/wince/system.pp index deb592367d..ae85fc1b81 100644 --- a/rtl/wince/system.pp +++ b/rtl/wince/system.pp @@ -74,7 +74,7 @@ const { ANSI <-> Wide } function AnsiToWideBuf(AnsiBuf: PChar; AnsiBufLen: longint; WideBuf: PWideChar; WideBufLen: longint): longint; -function WideToAnsiBuf(WideBuf: PWideChar; WideBufLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint; +function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint; function PCharToPWideChar(str: PChar; strlen: longint = -1; outlen: PLongInt = nil): PWideChar; function StringToPWideChar(const s: AnsiString; outlen: PLongInt = nil): PWideChar; @@ -333,10 +333,10 @@ begin Result:=Result*SizeOf(WideChar); end; -function WideToAnsiBuf(WideBuf: PWideChar; WideBufLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint; +function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint; begin - Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideBufLen, AnsiBuf, AnsiBufLen, nil, nil); - if ((WideBufLen <> -1) or (Result = 0)) and (AnsiBuf <> nil) then + Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideCharsLen, AnsiBuf, AnsiBufLen, nil, nil); + if ((WideCharsLen <> -1) or (Result = 0)) and (AnsiBuf <> nil) then begin if Result + 1 > AnsiBufLen then begin @@ -345,7 +345,7 @@ begin exit; end; AnsiBuf[Result] := #0; - if (Result <> 0) or (WideBufLen = 0) then + if (Result <> 0) or (WideCharsLen = 0) then Inc(Result); end; end; @@ -363,8 +363,10 @@ begin begin len:=len*SizeOf(WideChar); GetMem(Result, len); - if (AnsiToWideBuf(str, -1, Result, len) = 0) and (strlen <> -1) then + len:=AnsiToWideBuf(str, strlen, Result, len); + if (len = 0) and (strlen <> -1) then begin + FreeMem(Result); strlen:=-1; continue; end; @@ -377,7 +379,7 @@ begin break; end; if outlen <> nil then - outlen^:=(len - 1)*SizeOf(WideChar); + outlen^:=len - SizeOf(WideChar); end; function StringToPWideChar(const s: AnsiString; outlen: PLongInt = nil): PWideChar; diff --git a/rtl/wince/wininc/cemiss.inc b/rtl/wince/wininc/cemiss.inc index f6b80a7117..4cdd3ef81d 100644 --- a/rtl/wince/wininc/cemiss.inc +++ b/rtl/wince/wininc/cemiss.inc @@ -73,39 +73,120 @@ begin end; function RegEnumKeyExA(hKey:HKEY; dwIndex:DWORD; lpName:LPSTR; var cbName:DWORD; lpReserved:LPDWORD;lpClass:LPSTR; lpcbClass:LPDWORD; lpftLastWriteTime:PFILETIME):LONG; -var lpwsName, - lpwsClass: PWideChar; +var + ClassBuf, NameBuf: array[0..255] of WideChar; + csz, nsz: DWORD; begin - lpwsName:=PCharToPWideChar(lpName); - lpwsClass:=PCharToPWideChar(lpClass); - Result:=RegEnumKeyExW(hKey, dwIndex, lpwsName, cbName, lpReserved, lpwsClass, lpcbClass, lpftLastWriteTime); - FreeMem(lpwsName); FreeMem(lpwsClass); + csz:=SizeOf(ClassBuf) div SizeOf(WideChar); + nsz:=SizeOf(NameBuf) div SizeOf(WideChar); + Result:=RegEnumKeyExW(hKey, dwIndex, NameBuf, nsz, lpReserved, ClassBuf, @csz, lpftLastWriteTime); + if cbName > nsz then + WideToAnsiBuf(NameBuf, nsz, lpName, cbName); + cbName:=nsz; + if (Result = 0) and (lpcbClass <> nil) then begin + if (lpClass <> nil) and (lpcbClass^ > csz) then + WideToAnsiBuf(ClassBuf, csz, lpClass, lpcbClass^); + lpcbClass^:=csz; + end; end; function RegEnumValueA(hKey:HKEY; dwIndex:DWORD; lpValueName:LPSTR; var cbValueName: DWORD; lpReserved:LPDWORD;lpType:LPDWORD; lpData:pointer; lpcbData:LPDWORD):LONG; -var lpwsValueName: PWideChar; +var + t, sz, nsz: DWORD; + DataBuf: pointer; + NameBuf: array[0..255] of WideChar; begin - lpwsValueName:=PCharToPWideChar(lpValueName); - Result:=RegEnumValueW(hKey, dwIndex, lpwsValueName, @cbValueName, lpReserved, lpType, lpData, lpcbData); - FreeMem(lpwsValueName); + if lpcbData <> nil then + sz:=lpcbData^ + else + sz:=0; + if lpData <> nil then begin + sz:=sz*2; + GetMem(DataBuf, sz); + end + else + DataBuf:=nil; + nsz:=SizeOf(NameBuf) div SizeOf(WideChar); + Result:=RegEnumValueW(hKey, dwIndex, NameBuf, @nsz, lpReserved, @t, DataBuf, @sz); + if cbValueName > nsz then + WideToAnsiBuf(NameBuf, nsz, lpValueName, cbValueName); + cbValueName:=nsz; + if Result = 0 then begin + if lpType <> nil then + lpType^:=t; + if lpcbData <> nil then begin + if (lpData <> nil) and (t in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ]) then + sz:=WideCharToMultiByte(CP_ACP, 0, DataBuf, sz div SizeOf(WideChar), lpData, lpcbData^, nil, nil) + else begin + if sz > lpcbData^ then + Result:=ERROR_MORE_DATA + else + if lpData <> nil then + Move(DataBuf^, lpData^, sz); + end; + lpcbData^:=sz; + end; + end; + if DataBuf <> nil then + FreeMem(DataBuf); end; function RegQueryValueExA(hKey:HKEY; lpValueName:LPCSTR; lpReserved:LPDWORD; lpType:LPDWORD; lpData:pointer;lpcbData:LPDWORD):LONG; -var lpwsValueName: PWideChar; +var + lpwsValueName: PWideChar; + t, sz: DWORD; + DataBuf: pointer; begin + if lpcbData <> nil then + sz:=lpcbData^ + else + sz:=0; + if lpData <> nil then begin + sz:=sz*2; + GetMem(DataBuf, sz); + end + else + DataBuf:=nil; lpwsValueName:=PCharToPWideChar(lpValueName); - Result:=RegQueryValueExW(hKey, lpwsValueName, lpReserved, lpType, lpData, lpcbData); + Result:=RegQueryValueExW(hKey, lpwsValueName, lpReserved, @t, DataBuf, @sz); FreeMem(lpwsValueName); + if Result = 0 then begin + if lpType <> nil then + lpType^:=t; + if lpcbData <> nil then begin + if t in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin + sz:=sz div SizeOf(WideChar); + if lpData <> nil then + sz:=WideCharToMultiByte(CP_ACP, 0, DataBuf, sz, lpData, lpcbData^, nil, nil); + end + else begin + if sz > lpcbData^ then + Result:=ERROR_MORE_DATA + else + if lpData <> nil then + Move(DataBuf^, lpData^, sz); + end; + lpcbData^:=sz; + end; + end; + if DataBuf <> nil then + FreeMem(DataBuf); end; function RegQueryInfoKeyA(hKey:HKEY; lpClass:LPSTR; lpcbClass:LPDWORD; lpReserved:LPDWORD; lpcSubKeys:LPDWORD;lpcbMaxSubKeyLen:LPDWORD; lpcbMaxClassLen:LPDWORD; lpcValues:LPDWORD; lpcbMaxValueNameLen:LPDWORD; lpcbMaxValueLen:LPDWORD;lpcbSecurityDescriptor:LPDWORD; lpftLastWriteTime:PFILETIME):LONG; -var lpwsClass: PWideChar; +var + ClassBuf: array[0..255] of WideChar; + csz: DWORD; begin - lpwsClass:=PCharToPWideChar(lpClass); - Result:=RegQueryInfoKeyW(hKey, lpwsClass, lpcbClass, lpReserved, lpcSubKeys , lpcbMaxSubKeyLen, lpcbMaxClassLen, - lpcValues, lpcbMaxValueNameLen, lpcbMaxValueLen, lpcbSecurityDescriptor, lpftLastWriteTime); - FreeMem(lpwsClass); + csz:=SizeOf(ClassBuf) div SizeOf(WideChar); + Result:=RegQueryInfoKeyW(hKey, ClassBuf, @csz, lpReserved, lpcSubKeys , lpcbMaxSubKeyLen, lpcbMaxClassLen, + lpcValues, lpcbMaxValueNameLen, lpcbMaxValueLen, lpcbSecurityDescriptor, lpftLastWriteTime); + if (Result = 0) and (lpcbClass <> nil) then begin + if (lpClass <> nil) and (lpcbClass^ > csz) then + WideToAnsiBuf(ClassBuf, csz, lpClass, lpcbClass^); + lpcbClass^:=csz; + end; end; function RegOpenKeyExA(hKey:HKEY; lpSubKey:LPCSTR; ulOptions:DWORD; samDesired:REGSAM; var hkResult: HKEY):LONG; @@ -117,11 +198,24 @@ begin end; function RegSetValueExA(hKey:HKEY; lpValueName:LPCSTR; Reserved:DWORD; dwType:DWORD; lpData:pointer;cbData:DWORD):LONG; -var lpwsValueName: PWideChar; +var + lpwsValueName: PWideChar; + DataBuf: pointer; + sz: DWORD; begin lpwsValueName:=PCharToPWideChar(lpValueName); - Result:=RegSetValueExW(hKey, lpwsValueName, Reserved, dwType, lpData, cbData); + if dwType in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin + DataBuf:=PCharToPWideChar(lpData, cbData, @sz); + if (cbData > 0) and (PChar(lpData)[cbData - 1] <> #0) then + Inc(sz, SizeOf(WideChar)); + cbData:=sz; + end + else + DataBuf:=lpData; + Result:=RegSetValueExW(hKey, lpwsValueName, Reserved, dwType, DataBuf, cbData); FreeMem(lpwsValueName); + if DataBuf <> nil then + FreeMem(DataBuf); end; {$endif read_implementation} |