cemiss.inc 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2006 by the Free Pascal development team.
  4. Contains missing wince functions present in win32 api
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {
  12. *What should contain this file*
  13. functions missing on wince api
  14. }
  15. {$ifdef read_interface}
  16. function LoadLibraryA(lpLibFileName:LPCSTR):HINST;
  17. function RegCreateKeyExA(hKey:HKEY; lpSubKey:LPCSTR; Reserved:DWORD; lpClass:LPSTR; dwOptions:DWORD;samDesired:REGSAM; lpSecurityAttributes:LPSECURITY_ATTRIBUTES; var hkResult: HKEY; lpdwDisposition:LPDWORD):LONG;
  18. function RegDeleteKeyA(hKey:HKEY; lpSubKey:LPCSTR):LONG;
  19. function RegDeleteValueA(hKey:HKEY; lpValueName:LPCSTR):LONG;
  20. function RegEnumKeyExA(hKey:HKEY; dwIndex:DWORD; lpName:LPSTR; var cbName:DWORD; lpReserved:LPDWORD;lpClass:LPSTR; lpcbClass:LPDWORD; lpftLastWriteTime:PFILETIME):LONG;
  21. function RegEnumValueA(hKey:HKEY; dwIndex:DWORD; lpValueName:LPSTR; var cbValueName: DWORD; lpReserved:LPDWORD;lpType:LPDWORD; lpData:pointer; lpcbData:LPDWORD):LONG;
  22. function RegQueryValueExA(hKey:HKEY; lpValueName:LPCSTR; lpReserved:LPDWORD; lpType:LPDWORD; lpData:pointer;lpcbData:LPDWORD):LONG;
  23. function RegQueryInfoKeyA(hKey:HKEY; lpClass:LPSTR; lpcbClass:LPDWORD; lpReserved:LPDWORD; lpcSubKeys:LPDWORD;lpcbMaxSubKeyLen:LPDWORD; lpcbMaxClassLen:LPDWORD; lpcValues:LPDWORD; lpcbMaxValueNameLen:LPDWORD;
  24. lpcbMaxValueLen:LPDWORD;lpcbSecurityDescriptor:LPDWORD; lpftLastWriteTime:PFILETIME):LONG;
  25. function RegOpenKeyExA(hKey:HKEY; lpSubKey:LPCSTR; ulOptions:DWORD; samDesired:REGSAM; var hkResult: HKEY):LONG;
  26. function RegSetValueExA(hKey:HKEY; lpValueName:LPCSTR; Reserved:DWORD; dwType:DWORD; lpData:pointer;cbData:DWORD):LONG;
  27. {$endif read_interface}
  28. {$ifdef read_implementation}
  29. function LoadLibraryA(lpLibFileName:LPCSTR):HINST;
  30. var ws: PWideChar;
  31. begin
  32. ws:=PCharToPWideChar(lpLibFileName);
  33. Result:=Windows.LoadLibrary(ws);
  34. FreeMem(ws);
  35. end;
  36. function RegCreateKeyExA(hKey:HKEY; lpSubKey:LPCSTR; Reserved:DWORD; lpClass:LPSTR; dwOptions:DWORD;samDesired:REGSAM; lpSecurityAttributes:LPSECURITY_ATTRIBUTES; var hkResult: HKEY; lpdwDisposition:LPDWORD):LONG;
  37. var lpwsSubKey,
  38. lpwsClass: PWideChar;
  39. begin
  40. lpwsSubKey:=PCharToPWideChar(lpSubKey);
  41. lpwsClass:=PCharToPWideChar(lpClass);
  42. Result:=RegCreateKeyExW(hKey,lpwsSubKey,Reserved,lpwsClass,dwOptions,samDesired,lpSecurityAttributes, hkResult,lpdwDisposition);
  43. FreeMem(lpwsClass); FreeMem(lpwsSubKey);
  44. end;
  45. function RegDeleteKeyA(hKey:HKEY; lpSubKey:LPCSTR):LONG;
  46. var lpwsSubKey: PWideChar;
  47. begin
  48. lpwsSubKey:=PCharToPWideChar(lpSubKey);
  49. Result:=RegDeleteKeyW(hKey,lpwsSubKey);
  50. FreeMem(lpwsSubKey);
  51. end;
  52. function RegDeleteValueA(hKey:HKEY; lpValueName:LPCSTR):LONG;
  53. var lpwsValueName: PWideChar;
  54. begin
  55. lpwsValueName:=PCharToPWideChar(lpValueName);
  56. Result:=RegDeleteValueW(hKey,lpwsValueName);
  57. FreeMem(lpwsValueName);
  58. end;
  59. function RegEnumKeyExA(hKey:HKEY; dwIndex:DWORD; lpName:LPSTR; var cbName:DWORD; lpReserved:LPDWORD;lpClass:LPSTR; lpcbClass:LPDWORD; lpftLastWriteTime:PFILETIME):LONG;
  60. var
  61. ClassBuf, NameBuf: array[0..255] of WideChar;
  62. csz, nsz: DWORD;
  63. begin
  64. csz:=SizeOf(ClassBuf) div SizeOf(WideChar);
  65. nsz:=SizeOf(NameBuf) div SizeOf(WideChar);
  66. Result:=RegEnumKeyExW(hKey, dwIndex, NameBuf, nsz, lpReserved, ClassBuf, @csz, lpftLastWriteTime);
  67. if cbName > nsz then
  68. WideToAnsiBuf(NameBuf, nsz, lpName, cbName);
  69. cbName:=nsz;
  70. if (Result = 0) and (lpcbClass <> nil) then begin
  71. if (lpClass <> nil) and (lpcbClass^ > csz) then
  72. WideToAnsiBuf(ClassBuf, csz, lpClass, lpcbClass^);
  73. lpcbClass^:=csz;
  74. end;
  75. end;
  76. function RegEnumValueA(hKey:HKEY; dwIndex:DWORD; lpValueName:LPSTR; var cbValueName: DWORD; lpReserved:LPDWORD;lpType:LPDWORD; lpData:pointer; lpcbData:LPDWORD):LONG;
  77. var
  78. t, sz, nsz: DWORD;
  79. DataBuf: pointer;
  80. NameBuf: array[0..255] of WideChar;
  81. begin
  82. if lpcbData <> nil then
  83. sz:=lpcbData^
  84. else
  85. sz:=0;
  86. if lpData <> nil then begin
  87. sz:=sz*2;
  88. GetMem(DataBuf, sz);
  89. end
  90. else
  91. DataBuf:=nil;
  92. nsz:=SizeOf(NameBuf) div SizeOf(WideChar);
  93. Result:=RegEnumValueW(hKey, dwIndex, NameBuf, @nsz, lpReserved, @t, DataBuf, @sz);
  94. if cbValueName > nsz then
  95. WideToAnsiBuf(NameBuf, nsz, lpValueName, cbValueName);
  96. cbValueName:=nsz;
  97. if Result = 0 then begin
  98. if lpType <> nil then
  99. lpType^:=t;
  100. if lpcbData <> nil then begin
  101. if (lpData <> nil) and (t in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ]) then
  102. sz:=WideCharToMultiByte(CP_ACP, 0, DataBuf, sz div SizeOf(WideChar), lpData, lpcbData^, nil, nil)
  103. else begin
  104. if sz > lpcbData^ then
  105. Result:=ERROR_MORE_DATA
  106. else
  107. if lpData <> nil then
  108. Move(DataBuf^, lpData^, sz);
  109. end;
  110. lpcbData^:=sz;
  111. end;
  112. end;
  113. if DataBuf <> nil then
  114. FreeMem(DataBuf);
  115. end;
  116. function RegQueryValueExA(hKey:HKEY; lpValueName:LPCSTR; lpReserved:LPDWORD; lpType:LPDWORD; lpData:pointer;lpcbData:LPDWORD):LONG;
  117. var
  118. lpwsValueName: PWideChar;
  119. t, sz: DWORD;
  120. DataBuf: pointer;
  121. begin
  122. if lpcbData <> nil then
  123. sz:=lpcbData^
  124. else
  125. sz:=0;
  126. if lpData <> nil then begin
  127. sz:=sz*2;
  128. GetMem(DataBuf, sz);
  129. end
  130. else
  131. DataBuf:=nil;
  132. lpwsValueName:=PCharToPWideChar(lpValueName);
  133. Result:=RegQueryValueExW(hKey, lpwsValueName, lpReserved, @t, DataBuf, @sz);
  134. FreeMem(lpwsValueName);
  135. if Result = 0 then begin
  136. if lpType <> nil then
  137. lpType^:=t;
  138. if lpcbData <> nil then begin
  139. if t in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin
  140. sz:=sz div SizeOf(WideChar);
  141. if lpData <> nil then
  142. sz:=WideCharToMultiByte(CP_ACP, 0, DataBuf, sz, lpData, lpcbData^, nil, nil);
  143. end
  144. else begin
  145. if sz > lpcbData^ then
  146. Result:=ERROR_MORE_DATA
  147. else
  148. if lpData <> nil then
  149. Move(DataBuf^, lpData^, sz);
  150. end;
  151. lpcbData^:=sz;
  152. end;
  153. end;
  154. if DataBuf <> nil then
  155. FreeMem(DataBuf);
  156. end;
  157. function RegQueryInfoKeyA(hKey:HKEY; lpClass:LPSTR; lpcbClass:LPDWORD; lpReserved:LPDWORD; lpcSubKeys:LPDWORD;lpcbMaxSubKeyLen:LPDWORD; lpcbMaxClassLen:LPDWORD; lpcValues:LPDWORD; lpcbMaxValueNameLen:LPDWORD;
  158. lpcbMaxValueLen:LPDWORD;lpcbSecurityDescriptor:LPDWORD; lpftLastWriteTime:PFILETIME):LONG;
  159. var
  160. ClassBuf: array[0..255] of WideChar;
  161. csz: DWORD;
  162. begin
  163. csz:=SizeOf(ClassBuf) div SizeOf(WideChar);
  164. Result:=RegQueryInfoKeyW(hKey, ClassBuf, @csz, lpReserved, lpcSubKeys , lpcbMaxSubKeyLen, lpcbMaxClassLen,
  165. lpcValues, lpcbMaxValueNameLen, lpcbMaxValueLen, lpcbSecurityDescriptor, lpftLastWriteTime);
  166. if (Result = 0) and (lpcbClass <> nil) then begin
  167. if (lpClass <> nil) and (lpcbClass^ > csz) then
  168. WideToAnsiBuf(ClassBuf, csz, lpClass, lpcbClass^);
  169. lpcbClass^:=csz;
  170. end;
  171. end;
  172. function RegOpenKeyExA(hKey:HKEY; lpSubKey:LPCSTR; ulOptions:DWORD; samDesired:REGSAM; var hkResult: HKEY):LONG;
  173. var lpwsSubKey: PWideChar;
  174. begin
  175. lpwsSubKey:=PCharToPWideChar(lpSubKey);
  176. Result:=RegOpenKeyExW(hKey, lpwsSubKey, ulOptions, samDesired, hkResult);
  177. FreeMem(lpwsSubKey);
  178. end;
  179. function RegSetValueExA(hKey:HKEY; lpValueName:LPCSTR; Reserved:DWORD; dwType:DWORD; lpData:pointer;cbData:DWORD):LONG;
  180. var
  181. lpwsValueName, ws: PWideChar;
  182. DataBuf: pointer;
  183. sz: DWORD;
  184. begin
  185. lpwsValueName:=PCharToPWideChar(lpValueName);
  186. if dwType in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin
  187. if (cbData > 0) and (PChar(lpData)[cbData - 1] = #0) then
  188. Dec(cbData);
  189. ws:=PCharToPWideChar(lpData, cbData, @sz);
  190. cbData:=sz*SizeOf(WideChar);
  191. DataBuf:=ws;
  192. end
  193. else begin
  194. DataBuf:=lpData;
  195. ws:=nil;
  196. end;
  197. Result:=RegSetValueExW(hKey, lpwsValueName, Reserved, dwType, DataBuf, cbData);
  198. FreeMem(lpwsValueName);
  199. if ws <> nil then
  200. FreeMem(ws);
  201. end;
  202. {$endif read_implementation}