cregistry.cpp
上传用户:xiuanze55
上传日期:2017-08-03
资源大小:1080k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. //
  2. // Registry Access class (updated) by David Overton (david@insomniavisions.com).
  3. // These will compile either ANSI or UNICODE.
  4. #include "stdafx.h"
  5. #include "cregistry.h"
  6. // Returns true if the OS is Windows NT or Windows 2000
  7. bool CRegistry::IsWinNTor2K()
  8. {
  9.     OSVERSIONINFO OsVer;
  10.     GetVersionEx(&OsVer);
  11.     return (OsVer.dwPlatformId == VER_PLATFORM_WIN32_NT)!=0;
  12. }
  13. // Creates a key specified by pszSubKey - you can't create
  14. // keys directly under HKEY_LOCAL_MACHINE in Windows NT or 2000
  15. // just for an extra bit of info.
  16. bool CRegistry::CreateKey(HKEY hKeyRoot, LPCTSTR pszSubKey)
  17. {
  18.     HKEY hKey;
  19.     DWORD dwFunc;
  20.     LONG  lRet;
  21.     lRet = RegCreateKeyEx(
  22.         hKeyRoot, 
  23.         pszSubKey,
  24.         0,
  25.         (LPTSTR)NULL,
  26.         REG_OPTION_NON_VOLATILE,
  27.         KEY_WRITE, 
  28.         (LPSECURITY_ATTRIBUTES)NULL,
  29.         &hKey,
  30.         &dwFunc
  31.     );
  32.     if(lRet==ERROR_SUCCESS) {
  33.     
  34.         RegCloseKey(hKey);
  35.         hKey = (HKEY)NULL;
  36.         return true;
  37.     }
  38.     SetLastError((DWORD)lRet);
  39.     return false;   
  40. }
  41. bool CRegistry::DeleteKey(HKEY hKeyRoot, LPCTSTR pszSubKey)
  42. {
  43.     DWORD dwRet=ERROR_SUCCESS;
  44.     if(IsWinNTor2K()) { 
  45.         // WinNT/2K will not allow you to delete keys which have
  46.         // subkeys/values inside them. MS's platform SDK tells you
  47.         // to use the SHDeleteKey function in shlwapi.dll. This dll
  48.         // is not available on NT platforms without IE 4.0 or later.
  49.         // Because of this I first attempt to delete the key in the 
  50.         // hope that it is empty. If that is not possible I load shlwapi
  51.         // and call the function in that. This prevents the app bombing
  52.         // out if the dll can't be found.
  53.         if(RegDeleteKey(hKeyRoot, pszSubKey)!=ERROR_SUCCESS) {
  54.         
  55.             HINSTANCE hLibInst = LoadLibrary(_T("shlwapi.dll"));
  56.         
  57.             if(!hLibInst) {
  58.                 throw ERROR_NO_SHLWAPI_DLL;
  59.             }
  60. #if defined(UNICODE) || defined(_UNICODE) 
  61.             SHDELKEYPROC DeleteKeyRecursive = (SHDELKEYPROC)GetProcAddress(hLibInst, "SHDeleteKeyW");
  62. #else
  63.             SHDELKEYPROC DeleteKeyRecursive = (SHDELKEYPROC)GetProcAddress(hLibInst, "SHDeleteKeyA");
  64. #endif
  65.             if(!DeleteKeyRecursive) {
  66.                 FreeLibrary(hLibInst);
  67.                 throw ERROR_NO_SHDELETEKEY;
  68.             }
  69.         
  70.             dwRet = DeleteKeyRecursive(hKeyRoot, pszSubKey);
  71.         
  72.             FreeLibrary(hLibInst);
  73.         }
  74.     }
  75.     else {
  76.         // Windows 9x will allow RegDeleteKey to delete keys
  77.         // even if they have subkeys/values.
  78.         dwRet = RegDeleteKey(hKeyRoot, pszSubKey);
  79.     }
  80.     if(dwRet == ERROR_SUCCESS)
  81.         return true;
  82.     
  83.     SetLastError(dwRet);
  84.     return false;    
  85. }
  86. // Deletes a value from a given subkey and root
  87. bool CRegistry::DeleteValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue)
  88. {
  89.     HKEY hKey;
  90.     LONG lRes;
  91.     if((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_SET_VALUE, &hKey))!=ERROR_SUCCESS) {
  92.         SetLastError((DWORD)lRes);
  93.         return false;
  94.     }
  95.     lRes = RegDeleteValue(hKey, pszValue);
  96.     
  97.     RegCloseKey(hKey);
  98.     if(lRes==ERROR_SUCCESS)
  99.         return true;
  100.     SetLastError(lRes);
  101.     return false;
  102. }
  103. // Fetch a binary value. If the size specified by rdwSize is too small, rdwSize will
  104. // be set to the correct size.
  105. bool CRegistry::GetBinaryValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, PVOID pBuffer, DWORD& rdwSize)
  106. {
  107.     HKEY  hKey;
  108.     DWORD dwType = REG_BINARY;
  109.     DWORD dwSize = rdwSize;
  110.     LONG  lRes   = 0;
  111.     if((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_READ, &hKey))!=ERROR_SUCCESS) {
  112.         SetLastError((DWORD)lRes);
  113.         return false;
  114.     }
  115.     lRes = RegQueryValueEx(hKey, pszValue, 0, &dwType, (LPBYTE)pBuffer, &dwSize);
  116.     
  117.     rdwSize = dwSize;    
  118.     RegCloseKey(hKey);
  119.     
  120.     if(lRes!=ERROR_SUCCESS) {
  121.         SetLastError(lRes);
  122.         return false;
  123.     }
  124.     if(dwType!=REG_BINARY) {
  125.         throw ERROR_WRONG_TYPE;
  126.     }
  127.     
  128.     return true;
  129. }
  130. // Fetch a little endian DWORD from the registry (see platform SDK "Registry Value Types")
  131. bool CRegistry::GetDWORDValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, DWORD &rdwBuff)
  132. {
  133.     HKEY hKey;
  134.     DWORD dwType  = REG_DWORD;
  135.     DWORD dwSize  = sizeof(DWORD);
  136.     DWORD dwValue = 0;
  137.     LONG  lRes;
  138.     rdwBuff = 0;
  139.     if((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_READ, &hKey))!=ERROR_SUCCESS) {
  140.         SetLastError(lRes);
  141.         return false;
  142.     }
  143.     lRes = RegQueryValueEx(hKey, pszValue, 0, &dwType, (LPBYTE)&dwValue, &dwSize);
  144.     
  145.     RegCloseKey(hKey);
  146.     
  147.     if(dwType!=REG_DWORD)
  148.         throw ERROR_WRONG_TYPE;
  149.     
  150.     if(lRes!=ERROR_SUCCESS) {
  151.         SetLastError(lRes);
  152.         return false;
  153.     }
  154.     rdwBuff = dwValue;
  155.         
  156.     return true;
  157. }
  158. // Retrieve a string value. If the given buffer for the string is too small (specified
  159. // by rdwSize), rdwSize is increased to the correct value. If the buffer is bigger than
  160. // the retrieved string, rdwSize is set to the length of the string (in bytes) including
  161. // the terminating null.
  162. bool CRegistry::GetStringValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, LPTSTR pszBuffer, DWORD& rdwSize)
  163. {
  164.     HKEY hKey;
  165.     DWORD dwType = REG_SZ;
  166.     LONG  lRes;
  167.     DWORD dwBufferSize = rdwSize;
  168.     if(!pszBuffer)
  169.         throw ERROR_INVALID_BUFFER;
  170.     if((lRes=RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_READ, &hKey))!=ERROR_SUCCESS) {
  171.         SetLastError(lRes);
  172.         return false;
  173.     }
  174.     lRes = RegQueryValueEx(hKey, pszValue, NULL, &dwType, (unsigned char*)pszBuffer, &dwBufferSize);
  175.     RegCloseKey(hKey);
  176.     rdwSize = dwBufferSize;
  177.     if(dwType!=REG_SZ)
  178.         throw ERROR_WRONG_TYPE;
  179.     
  180.     if(lRes!=ERROR_SUCCESS) {
  181.         SetLastError(lRes);
  182.         return false;
  183.     }
  184.     return true;
  185. }
  186. // Writes a binary value to the registry
  187. bool CRegistry::SetBinaryValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, PVOID pData, DWORD dwSize)
  188. {
  189.     HKEY hKey;
  190.     LONG  lRes  = 0;
  191.     if((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_WRITE, &hKey))!=ERROR_SUCCESS) {
  192.         SetLastError(lRes);
  193.         return false;
  194.     }
  195.     lRes = RegSetValueEx(hKey, pszValue, 0, REG_BINARY, reinterpret_cast<BYTE*>(pData), dwSize);
  196.     RegCloseKey(hKey);
  197.     if(lRes!=ERROR_SUCCESS) {
  198.         SetLastError(lRes);
  199.         return false;
  200.     }
  201.     
  202.     return true;
  203. }
  204. // Writes a DWORD value to the registry
  205. bool CRegistry::SetDWORDValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, DWORD dwValue)
  206. {
  207.     HKEY hKey;
  208.     LONG lRes;
  209.     if((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_WRITE, &hKey))!=ERROR_SUCCESS) {
  210.         SetLastError(lRes);
  211.         return false;
  212.     }
  213.     lRes = RegSetValueEx(hKey, pszValue,0,REG_DWORD,reinterpret_cast<BYTE*>(&dwValue),sizeof(DWORD));
  214.     RegCloseKey(hKey);
  215.     if(lRes!=ERROR_SUCCESS) {
  216.         SetLastError(lRes);
  217.         return false;
  218.     }
  219. return true;
  220. }
  221. // Writes a string to the registry.
  222. bool CRegistry::SetStringValue(HKEY hKeyRoot, LPCTSTR pszSubKey, LPCTSTR pszValue, LPCTSTR pszString)
  223. {
  224.     HKEY  hKey;
  225.     LONG  lRes;
  226.     DWORD dwSize = lstrlen(pszString) * sizeof(TCHAR);
  227.     if((lRes = RegOpenKeyEx(hKeyRoot, pszSubKey, 0, KEY_WRITE, &hKey))!=ERROR_SUCCESS) {
  228.         SetLastError(lRes);
  229.         return false;
  230.     }   
  231.     lRes = RegSetValueEx(hKey, pszValue, 0, REG_SZ, reinterpret_cast<const BYTE*>(pszString), dwSize);
  232.     RegCloseKey(hKey);
  233.     if(lRes!=ERROR_SUCCESS) {
  234.         SetLastError(lRes);
  235.         return false;
  236.     }
  237.         
  238.     return true;
  239. }