REGISTRY.CPP
上传用户:zhuqijet
上传日期:2007-01-04
资源大小:138k
文件大小:13k
源码类别:

驱动编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "registry.h"
  3. #include "resource.h"
  4. /****************************************************************************
  5. *                                   makeKey
  6. * Inputs:
  7. * HKEY root: Root of key
  8. *       const CString & path: Path of the form
  9. * abcd...
  10. * HKEY * key: Result of opening key
  11. * Result: LONG
  12. *       The result of ::RegOpenKey
  13. * Effect: 
  14. *       If the path cannot be opened, tries to back off creating the key
  15. * one level at a time
  16. ****************************************************************************/
  17. static LONG makeKey(HKEY root, const CString & path, HKEY * key)
  18.     {
  19.      LONG result = ::RegOpenKey(root, path, key);
  20.      if(result == ERROR_SUCCESS)
  21. return result;
  22.      // We have a path of the form abcd  
  23.      // But apparently a/b/c doesn't exist
  24.      CString s;
  25.      int i = path.ReverseFind(_T('\'));
  26.      if(i == -1)
  27. return result;  // well, we lose
  28.      HKEY newkey;
  29.      s = path.Left(i);
  30.      result = makeKey(root, s, &newkey);
  31.      if(result != ERROR_SUCCESS)
  32. return result;
  33.      // OK, we now have created abc
  34.      CString v;
  35.      v = path.Right(path.GetLength() - i - 1);
  36.      DWORD disp;
  37.      result = ::RegCreateKeyEx(newkey, 
  38.       v,
  39. 0, NULL,
  40. REG_OPTION_NON_VOLATILE,
  41. KEY_ALL_ACCESS,
  42. NULL,
  43. key,
  44. &disp);
  45.      return result;
  46.     }
  47. /****************************************************************************
  48. *                                  makePath
  49. * Inputs:
  50. *       CString & path: Existing path
  51. * const CString & var: Value or subpath
  52. * CString & name: Place to put name
  53. * Result: void
  54. *       
  55. * Effect: 
  56. *       Takes a path of the form
  57. * thisthat
  58. * and a variable name 'var' of the form
  59. * whateversubstring
  60. * and updates 'path' so that it is
  61. * thisthatwhatever
  62. * and updates 'name' so that it is
  63. * substring
  64. ****************************************************************************/
  65. static void makePath(CString & path, const CString & var, CString & name)
  66.     {
  67.      // locate the rightmost  of the 'var'.  If there isn't one,
  68.      // we simply copy var to name...
  69.      int i = var.ReverseFind(_T('\'));
  70.      if(i == -1)
  71.         { /* no path */
  72.  name = var;
  73.  return;
  74. } /* no path */
  75.      // append the prefix of the var to the path, leaving only the name
  76.      if(path[path.GetLength() - 1] != _T('\'))
  77. path += _T("\");
  78.      path += var.Left(i);
  79.      name = var.Right(var.GetLength() - i - 1);
  80.     }
  81. /****************************************************************************
  82. *                              GetRegistryString
  83. * Inputs:
  84. * HKEY root: HKEY_CURRENT_USER, etc.
  85. *       const CString &var: Name of variable
  86. * CString &value: place to put value
  87. * Result: BOOL
  88. *       TRUE if registry key found, &val is updated
  89. * FALSE if registry key not found, &val is not modified
  90. * Effect: 
  91. *       Retrieves the key based on 
  92. * HKEY_CURRENT_USERIDS_PROGRAM_ROOTvar
  93. * HKEY_LOCAL_MACHINEIDS_PROGRAM_ROOTvar
  94. * Notes:
  95. * This presumes the value is a text string (SZ_TEXT)
  96. ****************************************************************************/
  97. BOOL GetRegistryString(HKEY root, const CString &var, CString & val)
  98.     {
  99.      CString path;
  100.      path.LoadString(IDS_PROGRAM_ROOT);
  101.      CString name;
  102.      makePath(path, var, name);
  103.      HKEY key;
  104.      LONG result = makeKey(root,
  105.              path,
  106.        &key);
  107.      if(result != ERROR_SUCCESS)
  108. return FALSE;
  109.      TCHAR buffer[256];
  110.      DWORD len = sizeof(buffer)/sizeof(TCHAR);
  111.      DWORD type;
  112.      result = ::RegQueryValueEx(key, name, 0, &type, (LPBYTE)buffer, &len);
  113.      ::RegCloseKey(key);
  114.      if(result != ERROR_SUCCESS)
  115.  return FALSE;
  116.      if(type != REG_SZ)
  117. return FALSE;
  118.      val = buffer;
  119.      return TRUE;
  120.     }
  121. /****************************************************************************
  122. *                               GetRegistryInt
  123. * Inputs:
  124. * HKEY  root: root of path
  125. *       const CString &var: Name of variable
  126. * LONG &val: Place to put value
  127. * Result: BOOL
  128. *       TRUE if registry key found, &val is updated
  129. * FALSE if registry key not found, &val is not modified
  130. * Effect: 
  131. *       Retrieves the key based on 
  132. * HKEY_CURRENT_USERIDS_PROGRAM_ROOTvar
  133. * HKEY_LOCAL_MACHINEIDS_PROGRAM_ROOTvar
  134. * Notes:
  135. * This presumes the value is a 32-bit value
  136. ****************************************************************************/
  137. BOOL GetRegistryInt(HKEY root, const CString &var, DWORD & val)
  138.     {
  139.      CString path;
  140.      path.LoadString(IDS_PROGRAM_ROOT);
  141.      CString name;
  142.      makePath(path, var, name);
  143.      HKEY key;
  144.      LONG result = makeKey(root,
  145.               path,
  146.         &key);
  147.      if(result != ERROR_SUCCESS)
  148. return FALSE;
  149.      DWORD buffer;
  150.      DWORD len =  sizeof(buffer);
  151.      DWORD type;
  152.      result = ::RegQueryValueEx(key, name, 0, &type, (LPBYTE)&buffer, &len);
  153.      ::RegCloseKey(key);
  154.      if(result != ERROR_SUCCESS)
  155.  return FALSE;
  156.      if(type != REG_DWORD)
  157.  return FALSE;
  158.      val = buffer;
  159.      return TRUE;
  160.     }
  161. /****************************************************************************
  162. *                            GetRegistryDWordArray
  163. * Inputs:
  164. * HKEY  root: root of path
  165. *       const CString &var: Name of variable
  166. * Result: CDWordArray
  167. *       The array of data
  168. * NULL if there is an error
  169. * Effect: 
  170. *       Allocates a DWORD array.  
  171. * Notes:
  172. * The caller is responsible for deleting the result
  173. ****************************************************************************/
  174. CDWordArray * GetRegistryDWordArray(HKEY root, const CString &var)
  175.     {
  176.      CString path;
  177.      DWORD len;
  178.      DWORD type;
  179.      
  180.      path.LoadString(IDS_PROGRAM_ROOT);
  181.      CString name;
  182.      makePath(path, var, name);
  183.      
  184.      HKEY key;
  185.      LONG result = makeKey(root,
  186.               path,
  187.         &key);
  188.      if(result != ERROR_SUCCESS)
  189. return NULL;
  190.      result = ::RegQueryValueEx(key, name, 0, &type, NULL, &len);
  191.      if(result != ERROR_SUCCESS)
  192.         { /* failed */
  193.  ::RegCloseKey(key);
  194.  return NULL;
  195. } /* failed */
  196.      CDWordArray * data = new CDWordArray;
  197.      DWORD count = len / sizeof(DWORD);
  198.      data->SetSize(count); // preallocate the array data
  199.      result = ::RegQueryValueEx(key, name, 0, &type, (LPBYTE)&(*data)[0], &len);
  200.      if(result != ERROR_SUCCESS)
  201.         { /* failed */
  202.  ::RegCloseKey(key);
  203.  delete data;
  204.  return NULL;
  205. } /* failed */
  206.      ::RegCloseKey(key);
  207.      return data;
  208.     }
  209. /****************************************************************************
  210. *                            SetRegistryDWordArray
  211. * Inputs:
  212. * HKEY  root: root of path
  213. *       const CString &var: Name of variable
  214. * CDWordArray & data: Data to write
  215. * Result: BOOL
  216. *       TRUE if successful
  217. * FALSE if error
  218. * Effect: 
  219. *       Writes the data for the key
  220. ****************************************************************************/
  221. BOOL SetRegistryDWordArray(HKEY root, const CString & var, CDWordArray & data)
  222.     {
  223.      CString path;
  224.      
  225.      path.LoadString(IDS_PROGRAM_ROOT);
  226.      CString name;
  227.      makePath(path, var, name);
  228.      HKEY key;
  229.      LONG result = makeKey(root,
  230.               path,
  231.         &key);
  232.      if(result != ERROR_SUCCESS)
  233. return FALSE;
  234.      
  235.      result = ::RegSetValueEx(key, name, 0, REG_BINARY, (LPBYTE)&(data[0]), 
  236.       data.GetSize() * sizeof(DWORD));
  237.      ::RegCloseKey(key);
  238.      return result == ERROR_SUCCESS;
  239.     }
  240. /****************************************************************************
  241. *                              SetRegistryString
  242. * Inputs:
  243. * HKEY root: root of search
  244. *       const CString & var: Name of variable
  245. * CString & val: Value to write
  246. * Result: BOOL
  247. *       TRUE if registry key set
  248. * FALSE if registry key not set
  249. * Effect: 
  250. *       Retrieves the key based on 
  251. * HKEY_CURRENT_USERIDS_PROGRAM_ROOTvar
  252. * HKEY_LOCAL_MACHINEIDS_PROGRAM_ROOTvar
  253. * Notes:
  254. * This presumes the value is a string
  255. ****************************************************************************/
  256. BOOL SetRegistryString(HKEY root, const CString & var, const CString & val)
  257.     {
  258.      CString path;
  259.      path.LoadString(IDS_PROGRAM_ROOT);
  260.      CString name;
  261.      makePath(path, var, name);
  262.      HKEY key;
  263.      DWORD disp;
  264.      LONG result = ::RegCreateKeyEx(root,
  265.           path,
  266.     0, NULL, 
  267.     REG_OPTION_NON_VOLATILE,
  268.     KEY_ALL_ACCESS,
  269.     NULL,
  270.     &key,
  271.     &disp);
  272.      if(result != ERROR_SUCCESS)
  273. return FALSE;
  274.      result = ::RegSetValueEx(key, name, 0, REG_SZ, (LPBYTE)(LPCTSTR)val, lstrlen(val));
  275.      ::RegCloseKey(key);
  276.      if(result != ERROR_SUCCESS)
  277.  return FALSE;
  278.      return TRUE;
  279.     }
  280. /****************************************************************************
  281. *                              SetRegistryInt
  282. * HKEY root : root of search
  283. *       const CString var: Name of variable, including possibly path info
  284. * DWORD val: Place to put value
  285. * Result: BOOL
  286. *       TRUE if registry key set
  287. * FALSE if registry key not set
  288. * Effect: 
  289. *       Retrieves the key based on 
  290. * HKEY_CURRENT_USERIDS_PROGRAM_ROOTvar
  291. * HKEY_LOCAL_MACHINEIDS_PROGRAM_ROOTvar
  292. * Notes:
  293. * This presumes the value is a string
  294. ****************************************************************************/
  295. BOOL SetRegistryInt(HKEY root, const CString & var, DWORD val)
  296.     {
  297.      CString path;
  298.      path.LoadString(IDS_PROGRAM_ROOT);
  299.      CString name;
  300.      makePath(path, var, name);
  301.      HKEY key;
  302.      DWORD disp;
  303.      LONG result = ::RegCreateKeyEx(root,
  304.                   path,
  305.     0, NULL, 
  306.     REG_OPTION_NON_VOLATILE,
  307.     KEY_ALL_ACCESS,
  308.     NULL,
  309.     &key,
  310.     &disp);
  311.      if(result != ERROR_SUCCESS)
  312. return FALSE;
  313.      result = ::RegSetValueEx(key, name, 0, REG_DWORD, (LPBYTE)&val, sizeof(DWORD));
  314.      ::RegCloseKey(key);
  315.      if(result != ERROR_SUCCESS)
  316.  return FALSE;
  317.      return TRUE;
  318.     }
  319. /****************************************************************************
  320. *                              EnumRegistryKeys
  321. * Inputs:
  322. *       HKEY root: Root of search
  323. * const CString & group: Name of group key
  324. * Result: CStringArray *
  325. *       Array of key names, NULL if no keys found
  326. * Effect: 
  327. *       Enumerates the keys
  328. ****************************************************************************/
  329. CStringArray * EnumRegistryKeys(HKEY root, const CString & group)
  330.     {
  331.      CString path;
  332.      CStringArray * keys;
  333.      TCHAR itemName[512];
  334.      path.LoadString(IDS_PROGRAM_ROOT);
  335.      path += _T("\");
  336.      path += group;
  337.      HKEY key;
  338.      LONG result = makeKey(root, path, &key);
  339.      if(result != ERROR_SUCCESS)
  340. return NULL;
  341.      keys = new CStringArray;
  342.      DWORD i = 0;
  343.      while(TRUE)
  344.         { /* loop */
  345.  LONG result = ::RegEnumKey(key, i, itemName, sizeof(itemName)/sizeof(TCHAR));
  346.  if(result != ERROR_SUCCESS)
  347.     break;
  348.          // we have a valid key name
  349.  keys->SetAtGrow(i, itemName);
  350.  i++;
  351. } /* loop */
  352.      ::RegCloseKey(key);
  353.      return keys;
  354.     }
  355. /****************************************************************************
  356. *                              EnumRegistryValues
  357. * Inputs:
  358. *       HKEY root: Root of search
  359. * const CString & group: Name of value group key
  360. * Result: CStringArray *
  361. *       Array of value names, NULL if no keys found
  362. * Effect: 
  363. *       Enumerates the keys
  364. ****************************************************************************/
  365. CStringArray * EnumRegistryValues(HKEY root, const CString & group)
  366.     {
  367.      CString path;
  368.      CStringArray * keys;
  369.      TCHAR itemName[512];
  370.      path.LoadString(IDS_PROGRAM_ROOT);
  371.      path += _T("\");
  372.      path += group;
  373.      HKEY key;
  374.      LONG result = makeKey(root, path, &key);
  375.      if(result != ERROR_SUCCESS)
  376. return NULL;
  377.      keys = new CStringArray;
  378.      DWORD i = 0;
  379.      while(TRUE)
  380.         { /* loop */
  381.  DWORD length = sizeof(itemName)/sizeof(TCHAR);
  382.  LONG result = ::RegEnumValue(key, // key selection
  383.         i,   // which key
  384.       itemName, // place to put value name
  385.       &length,  // in: length of buffer
  386.                // out: length of name
  387.       NULL,  // reserved, NULL
  388.       NULL,  // place to put type
  389.       NULL,  // place to put value
  390.       NULL); // place to put value length
  391.  if(result != ERROR_SUCCESS)
  392.     break;
  393.          // we have a valid key name
  394.  keys->SetAtGrow(i, itemName);
  395.  i++;
  396. } /* loop */
  397.      ::RegCloseKey(key);
  398.      return keys;
  399.     }