summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-08-22 22:27:41 +0000
committeryury <yury@3ad0048d-3df7-0310-abae-a5850022a9f2>2007-08-22 22:27:41 +0000
commit465282a38c3e39d9beb84dcdd9b230a93a4c6343 (patch)
treeee41fe804d552a8e211c1f5fba8e9c1f176b81be
parentcdbff2dd799515d24d2a10734eaf09f73075f644 (diff)
downloadfpc-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.pp16
-rw-r--r--rtl/wince/wininc/cemiss.inc132
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}