XTRegistryManager.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:22k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTRegistryManager.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPVC80Helpers.h"
  22. #include "XTRegistryManager.h"
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CHKey - helper automatically closes open HKEY
  30. class CXTRegistryManager::CHKey
  31. {
  32. public:
  33. CHKey(HKEY hKey = NULL) : m_hKey(hKey)
  34. {
  35. }
  36. ~CHKey()
  37. {
  38. if (m_hKey != NULL)
  39. {
  40. ::RegCloseKey(m_hKey);
  41. }
  42. }
  43. HKEY& operator=(HKEY hKey)
  44. {
  45. if (m_hKey != NULL)
  46. {
  47. ::RegCloseKey(m_hKey);
  48. }
  49. m_hKey = hKey;
  50. return m_hKey;
  51. }
  52. BOOL operator==(HKEY hKey)
  53. {
  54. return m_hKey == hKey;
  55. }
  56. operator HKEY() const
  57. {
  58. return m_hKey;
  59. }
  60. operator PHKEY()
  61. {
  62. return &m_hKey;
  63. }
  64. private:
  65. HKEY m_hKey;
  66. };
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CXTRegistryManager
  69. CString CXTRegistryManager::m_strINIFileName = _T("");
  70. CXTRegistryManager::CXTRegistryManager(HKEY hKeyBase/*= HKEY_CURRENT_USER*/)
  71. : m_pszRegistryKey(NULL)
  72. , m_pszProfileName(NULL)
  73. , m_lResult(ERROR_SUCCESS)
  74. {
  75. ASSERT(hKeyBase == HKEY_CURRENT_USER || hKeyBase == HKEY_LOCAL_MACHINE);
  76. m_hKeyBase = hKeyBase;
  77. }
  78. CXTRegistryManager::~CXTRegistryManager()
  79. {
  80. }
  81. BOOL CXTRegistryManager::GetProfileInfo()
  82. {
  83. if (m_pszRegistryKey == NULL || m_pszProfileName == NULL)
  84. {
  85. CWinApp* pWinApp = AfxGetApp();
  86. if (pWinApp != NULL)
  87. {
  88. m_pszRegistryKey = pWinApp->m_pszRegistryKey;
  89. m_pszProfileName = pWinApp->m_pszProfileName;
  90. }
  91. // If this fails, you need to call SetRegistryKey(...); in your
  92. // applications CWinApp::InitInstance() override, or you have called
  93. // this method before you call SetRegistryKey..  Calling SetRegistryKey
  94. // will initialize m_pszProfileName and m_pszRegistryKey for CWinApp.
  95. // NOTE: If you want to write to an INI file instead of the system
  96. // registry, call CXTRegistryManager::SetINIFileName(...) prior to
  97. // making this call.
  98. if (m_pszRegistryKey == NULL || m_pszProfileName == NULL)
  99. {
  100. return FALSE;
  101. }
  102. }
  103. return TRUE;
  104. }
  105. /////////////////////////////////////////////////////////////////////////////
  106. HKEY CXTRegistryManager::GetAppRegistryKey(REGSAM samDesired)
  107. {
  108. if (!GetProfileInfo())
  109. return 0;
  110. HKEY hAppKey = NULL;
  111. CHKey hSoftKey;
  112. CHKey hCompanyKey;
  113. m_lResult = ::RegOpenKeyEx(m_hKeyBase, _T("Software"), 0,
  114. samDesired, hSoftKey);
  115. if (m_lResult != ERROR_SUCCESS)
  116. return NULL;
  117. DWORD dw = 0;
  118. m_lResult = ::RegCreateKeyEx(hSoftKey, m_pszRegistryKey, 0, REG_NONE,
  119. REG_OPTION_NON_VOLATILE, samDesired, NULL, hCompanyKey, &dw);
  120. if (m_lResult != ERROR_SUCCESS)
  121. return NULL;
  122. m_lResult = ::RegCreateKeyEx(hCompanyKey, m_pszProfileName, 0, REG_NONE,
  123. REG_OPTION_NON_VOLATILE, samDesired, NULL, &hAppKey, &dw);
  124. if (m_lResult != ERROR_SUCCESS)
  125. return NULL;
  126. return hAppKey;
  127. }
  128. HKEY CXTRegistryManager::GetSectionKey(LPCTSTR lpszSection, REGSAM samDesired)
  129. {
  130. ASSERT(lpszSection != NULL);
  131. if (!lpszSection)
  132. return 0;
  133. HKEY hSectionKey = NULL;
  134. CHKey hAppKey(GetAppRegistryKey(samDesired));
  135. if (hAppKey == NULL)
  136. return NULL;
  137. DWORD dw = 0;
  138. m_lResult = ::RegCreateKeyEx(hAppKey, lpszSection, 0, REG_NONE,
  139. REG_OPTION_NON_VOLATILE, samDesired, NULL, &hSectionKey, &dw);
  140. if (m_lResult != ERROR_SUCCESS)
  141. return NULL;
  142. return hSectionKey;
  143. }
  144. BOOL CXTRegistryManager::WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue)
  145. {
  146. ASSERT(lpszSection != NULL);
  147. ASSERT(lpszEntry != NULL);
  148. if (!lpszSection)
  149. return 0;
  150. if (m_strINIFileName.IsEmpty())
  151. {
  152. if (!GetProfileInfo())
  153. return FALSE;
  154. CHKey hSecKey(GetSectionKey(lpszSection));
  155. if (hSecKey == NULL)
  156. return FALSE;
  157. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL,
  158. REG_DWORD, (LPBYTE)&nValue, sizeof(nValue));
  159. if (m_lResult != ERROR_SUCCESS)
  160. return FALSE;
  161. return TRUE;
  162. }
  163. else
  164. {
  165. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  166. TCHAR szT[16];
  167. wsprintf(szT, _T("%d"), nValue);
  168. return ::WritePrivateProfileString(lpszSection, lpszEntry, szT,
  169. m_strINIFileName);
  170. }
  171. }
  172. BOOL CXTRegistryManager::WriteProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes)
  173. {
  174. ASSERT(lpszSection != NULL);
  175. ASSERT(lpszEntry != NULL);
  176. if (m_strINIFileName.IsEmpty())
  177. {
  178. if (!GetProfileInfo())
  179. return FALSE;
  180. CHKey hSecKey(GetSectionKey(lpszSection));
  181. if (hSecKey == NULL)
  182. return FALSE;
  183. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
  184. pData, nBytes);
  185. if (m_lResult != ERROR_SUCCESS)
  186. return FALSE;
  187. return TRUE;
  188. }
  189. // convert to string and write out
  190. LPTSTR lpsz = new TCHAR[nBytes * 2 + 1];
  191. UINT i;
  192. for (i = 0; i < nBytes; i++)
  193. {
  194. lpsz[i * 2] = (TCHAR)((pData[i] & 0x0F) + 'A'); //low nibble
  195. lpsz[i * 2 + 1] = (TCHAR)(((pData[i] >> 4) & 0x0F) + 'A'); //high nibble
  196. }
  197. lpsz[i * 2] = 0;
  198. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  199. BOOL bResult = WriteProfileString(lpszSection, lpszEntry, lpsz);
  200. delete[] lpsz;
  201. return bResult;
  202. }
  203. BOOL CXTRegistryManager::WriteProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue)
  204. {
  205. ASSERT(lpszSection != NULL);
  206. if (!lpszSection)
  207. return 0;
  208. if (m_strINIFileName.IsEmpty())
  209. {
  210. if (!GetProfileInfo())
  211. return FALSE;
  212. if (lpszEntry == NULL) //delete whole section
  213. {
  214. CHKey hAppKey(GetAppRegistryKey(FALSE));
  215. if (hAppKey == NULL)
  216. return FALSE;
  217. m_lResult = ::RegDeleteKey(hAppKey, lpszSection);
  218. if (m_lResult != ERROR_SUCCESS)
  219. return FALSE;
  220. }
  221. else if (lpszValue == NULL)
  222. {
  223. CHKey hSecKey(GetSectionKey(lpszSection));
  224. if (hSecKey == NULL)
  225. return FALSE;
  226. // necessary to cast away const below
  227. m_lResult = ::RegDeleteValue(hSecKey, (LPTSTR)lpszEntry);
  228. if (m_lResult != ERROR_SUCCESS)
  229. return FALSE;
  230. }
  231. else
  232. {
  233. CHKey hSecKey(GetSectionKey(lpszSection));
  234. if (hSecKey == NULL)
  235. return FALSE;
  236. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_SZ,
  237. (LPBYTE)lpszValue, (lstrlen(lpszValue)+1)*sizeof(TCHAR));
  238. if (m_lResult != ERROR_SUCCESS)
  239. return FALSE;
  240. }
  241. return TRUE;
  242. }
  243. else
  244. {
  245. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  246. ASSERT(m_strINIFileName.GetLength() < 4095); // can't read in bigger
  247. return ::WritePrivateProfileString(lpszSection, lpszEntry, lpszValue,
  248. m_strINIFileName);
  249. }
  250. }
  251. UINT CXTRegistryManager::GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault)
  252. {
  253. ASSERT(lpszSection != NULL);
  254. ASSERT(lpszEntry != NULL);
  255. if (!lpszSection || !lpszEntry)
  256. return 0;
  257. if (m_strINIFileName.IsEmpty()) // use registry
  258. {
  259. if (!GetProfileInfo())
  260. return nDefault;
  261. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  262. if (hSecKey == NULL)
  263. return nDefault;
  264. DWORD dwValue;
  265. DWORD dwType;
  266. DWORD dwCount = sizeof(DWORD);
  267. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  268. (LPBYTE)&dwValue, &dwCount);
  269. if (m_lResult != ERROR_SUCCESS)
  270. return nDefault;
  271. ASSERT(dwType == REG_DWORD);
  272. ASSERT(dwCount == sizeof(dwValue));
  273. return (UINT)dwValue;
  274. }
  275. else
  276. {
  277. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  278. return ::GetPrivateProfileInt(lpszSection, lpszEntry, nDefault,
  279. m_strINIFileName);
  280. }
  281. }
  282. BOOL CXTRegistryManager::GetProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry, BYTE** ppData, UINT* pBytes)
  283. {
  284. ASSERT(lpszSection != NULL);
  285. ASSERT(lpszEntry != NULL);
  286. ASSERT(ppData != NULL);
  287. ASSERT(pBytes != NULL);
  288. if (!ppData || !pBytes)
  289. return FALSE;
  290. *ppData = NULL;
  291. *pBytes = 0;
  292. if (m_strINIFileName.IsEmpty())
  293. {
  294. if (!GetProfileInfo())
  295. return FALSE;
  296. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  297. if (hSecKey == NULL)
  298. return FALSE;
  299. DWORD dwType, dwCount;
  300. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  301. NULL, &dwCount);
  302. if (m_lResult != ERROR_SUCCESS)
  303. return FALSE;
  304. *pBytes = dwCount;
  305. *ppData = new BYTE[*pBytes];
  306. ASSERT(dwType == REG_BINARY);
  307. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  308. *ppData, &dwCount);
  309. if (m_lResult != ERROR_SUCCESS)
  310. {
  311. SAFE_DELETE_AR(*ppData);
  312. return FALSE;
  313. }
  314. ASSERT(dwType == REG_BINARY);
  315. return TRUE;
  316. }
  317. else
  318. {
  319. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  320. CString str = GetProfileString(lpszSection, lpszEntry, NULL);
  321. if (str.IsEmpty())
  322. return FALSE;
  323. ASSERT(str.GetLength()%2 == 0);
  324. int nLen = str.GetLength();
  325. *pBytes = nLen/2;
  326. *ppData = new BYTE[*pBytes];
  327. int i;
  328. for (i = 0; i < nLen; i += 2)
  329. {
  330. (*ppData)[i/2] = (BYTE)
  331. (((str[i + 1] - 'A') << 4) + (str[i] - 'A'));
  332. }
  333. return TRUE;
  334. }
  335. }
  336. CString CXTRegistryManager::GetProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault)
  337. {
  338. ASSERT(lpszSection != NULL);
  339. ASSERT(lpszEntry != NULL);
  340. if (m_strINIFileName.IsEmpty())
  341. {
  342. if (!GetProfileInfo())
  343. return lpszDefault;
  344. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  345. if (hSecKey == NULL)
  346. return lpszDefault;
  347. CString strValue;
  348. DWORD dwType, dwCount;
  349. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  350. NULL, &dwCount);
  351. if (m_lResult != ERROR_SUCCESS)
  352. return lpszDefault;
  353. ASSERT(dwType == REG_SZ);
  354. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  355. (LPBYTE)strValue.GetBuffer(dwCount/sizeof(TCHAR)), &dwCount);
  356. strValue.ReleaseBuffer();
  357. if (m_lResult != ERROR_SUCCESS)
  358. return lpszDefault;
  359. ASSERT(dwType == REG_SZ);
  360. return strValue;
  361. }
  362. else
  363. {
  364. TCHAR chNil = '';
  365. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  366. if (lpszDefault == NULL)
  367. {
  368. lpszDefault = &chNil;    // don't pass in NULL
  369. }
  370. TCHAR szT[4096];
  371. DWORD dw = ::GetPrivateProfileString(lpszSection, lpszEntry,
  372. lpszDefault, szT, _countof(szT), m_strINIFileName);
  373. ASSERT(dw < 4095);
  374. return szT;
  375. }
  376. }
  377. int CXTRegistryManager::EnumValues(LPCTSTR lpszSection, CMap<CString, LPCTSTR, DWORD, DWORD&>* mapItems,
  378. CStringArray * arrayNames)
  379. {
  380. ASSERT(lpszSection != NULL);
  381. CHKey hKey(GetSectionKey(lpszSection, KEY_READ));
  382. if (hKey == NULL)
  383. return 0;
  384. int index = 0;
  385. TCHAR szValue[512];
  386. DWORD dwLen = 512;
  387. DWORD dwType;
  388. while (::RegEnumValue(hKey, index++, szValue, &dwLen,
  389. NULL, &dwType, NULL, NULL) == ERROR_SUCCESS)
  390. {
  391. if (mapItems) mapItems->SetAt(szValue, dwType);
  392. if (arrayNames) arrayNames->Add(szValue);
  393. dwLen = 512;
  394. }
  395. return --index;
  396. }
  397. int CXTRegistryManager::EnumKeys(LPCTSTR lpszSection, CStringArray & arrayKeys)
  398. {
  399. ASSERT(lpszSection != NULL);
  400. CHKey hKey(GetSectionKey(lpszSection, KEY_READ));
  401. if (hKey == NULL)
  402. return 0;
  403. int index = 0;
  404. TCHAR szValue[512];
  405. DWORD dwLen = 512;
  406. while (::RegEnumKeyEx(hKey, index++, szValue, &dwLen,
  407. NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
  408. {
  409. arrayKeys.Add(szValue);
  410. dwLen = 512;
  411. }
  412. return --index;
  413. }
  414. LONG CXTRegistryManager::RecurseDeleteKey(HKEY hKey, LPCTSTR lpszKey)
  415. {
  416. CHKey hSubKey;
  417. LONG lRes = ::RegOpenKeyEx(hKey, lpszKey, 0, KEY_READ | KEY_WRITE, hSubKey);
  418. if (lRes != ERROR_SUCCESS)
  419. return lRes;
  420. FILETIME time;
  421. DWORD dwSize = 256;
  422. TCHAR szBuffer[256];
  423. while (::RegEnumKeyEx(hSubKey, 0, szBuffer, &dwSize, NULL, NULL, NULL,
  424. &time) == ERROR_SUCCESS)
  425. {
  426. lRes = RecurseDeleteKey(hSubKey, szBuffer);
  427. if (lRes != ERROR_SUCCESS)
  428. return lRes;
  429. dwSize = 256;
  430. }
  431. m_lResult = ::RegDeleteKey(hKey, lpszKey);
  432. return m_lResult;
  433. }
  434. bool CXTRegistryManager::DeleteKey(LPCTSTR lpszSection, LPCTSTR lpszKey)
  435. {
  436. CHKey hSectionKey(GetSectionKey(lpszSection));
  437. if (hSectionKey == NULL)
  438. return false;
  439. return (RecurseDeleteKey(hSectionKey, lpszKey) == ERROR_SUCCESS);
  440. }
  441. bool CXTRegistryManager::DeleteValue(LPCTSTR lpszSection, LPCTSTR lpszValue)
  442. {
  443. CHKey hSecKey(GetSectionKey(lpszSection, KEY_ALL_ACCESS));
  444. if (hSecKey == NULL)
  445. return false;
  446. m_lResult = ::RegDeleteValue(hSecKey, (LPTSTR)lpszValue);
  447. return (m_lResult == ERROR_SUCCESS);
  448. }
  449. BOOL CXTRegistryManager::WriteProfilePoint(LPCTSTR lpszSection, LPCTSTR lpszEntry, CPoint* pValue)
  450. {
  451. ASSERT(lpszSection != NULL);
  452. if (m_strINIFileName.IsEmpty())
  453. {
  454. if (!GetProfileInfo())
  455. return FALSE;
  456. CHKey hSecKey(GetSectionKey(lpszSection));
  457. if (hSecKey == NULL)
  458. return FALSE;
  459. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
  460. (LPBYTE)pValue, sizeof(CPoint));
  461. if (m_lResult != ERROR_SUCCESS)
  462. return FALSE;
  463. return TRUE;
  464. }
  465. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  466. CString str;
  467. str.Format(_T("%i,%i"), pValue->x, pValue->y);
  468. BOOL bResult = WriteProfileString(lpszSection, lpszEntry, str);
  469. return bResult;
  470. }
  471. BOOL CXTRegistryManager::GetProfilePoint(LPCTSTR lpszSection, LPCTSTR lpszEntry, CPoint* ptResult)
  472. {
  473. ASSERT(lpszSection != NULL);
  474. ASSERT(lpszEntry != NULL);
  475. if (m_strINIFileName.IsEmpty())
  476. {
  477. if (!GetProfileInfo())
  478. return FALSE;
  479. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  480. if (hSecKey == NULL)
  481. return FALSE;
  482. DWORD dwType, dwCount;
  483. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  484. NULL, &dwCount);
  485. if (m_lResult != ERROR_SUCCESS)
  486. return FALSE;
  487. ASSERT(dwType == REG_BINARY);
  488. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  489. (LPBYTE)ptResult, &dwCount);
  490. if (m_lResult != ERROR_SUCCESS)
  491. return FALSE;
  492. ASSERT(dwType == REG_BINARY);
  493. return TRUE;
  494. }
  495. else
  496. {
  497. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  498. CString str = GetProfileString(lpszSection, lpszEntry, NULL);
  499. if (str.IsEmpty())
  500. return FALSE;
  501. SCANF_S(str, _T("%ld,%ld"), &ptResult->x, &ptResult->y);
  502. return TRUE;
  503. }
  504. }
  505. BOOL CXTRegistryManager::WriteProfileRect(LPCTSTR lpszSection, LPCTSTR lpszEntry, CRect* pValue)
  506. {
  507. ASSERT(lpszSection != NULL);
  508. if (m_strINIFileName.IsEmpty())
  509. {
  510. if (!GetProfileInfo())
  511. return FALSE;
  512. CHKey hSecKey(GetSectionKey(lpszSection));
  513. if (hSecKey == NULL)
  514. return FALSE;
  515. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
  516. (LPBYTE)pValue, sizeof(CRect));
  517. if (m_lResult != ERROR_SUCCESS)
  518. return FALSE;
  519. return TRUE;
  520. }
  521. CString str;
  522. str.Format(_T("%i,%i,%i,%i"), pValue->left, pValue->top, pValue->right, pValue->bottom);
  523. BOOL bResult = WriteProfileString(lpszSection, lpszEntry, str);
  524. return bResult;
  525. }
  526. BOOL CXTRegistryManager::GetProfileRect(LPCTSTR lpszSection, LPCTSTR lpszEntry, CRect* rcResult)
  527. {
  528. ASSERT(lpszSection != NULL);
  529. ASSERT(lpszEntry != NULL);
  530. if (m_strINIFileName.IsEmpty())
  531. {
  532. if (!GetProfileInfo())
  533. return FALSE;
  534. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  535. if (hSecKey == NULL)
  536. return FALSE;
  537. DWORD dwType, dwCount;
  538. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  539. NULL, &dwCount);
  540. if (m_lResult != ERROR_SUCCESS)
  541. return FALSE;
  542. ASSERT(dwType == REG_BINARY);
  543. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  544. (LPBYTE)rcResult, &dwCount);
  545. if (m_lResult != ERROR_SUCCESS)
  546. return FALSE;
  547. return TRUE;
  548. }
  549. else
  550. {
  551. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  552. // convert to string and write out
  553. CString str = GetProfileString(lpszSection, lpszEntry, NULL);
  554. if (str.IsEmpty())
  555. return FALSE;
  556. SCANF_S(str, _T("%ld,%ld,%ld,%ld"), &rcResult->left, &rcResult->top, &rcResult->right, &rcResult->bottom);
  557. return TRUE;
  558. }
  559. }
  560. BOOL CXTRegistryManager::WriteProfileSize(LPCTSTR lpszSection, LPCTSTR lpszEntry, CSize* pValue)
  561. {
  562. ASSERT(lpszSection != NULL);
  563. if (m_strINIFileName.IsEmpty())
  564. {
  565. if (!GetProfileInfo())
  566. return FALSE;
  567. CHKey hSecKey(GetSectionKey(lpszSection));
  568. if (hSecKey == NULL)
  569. return FALSE;
  570. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
  571. (LPBYTE)pValue, sizeof(CSize));
  572. if (m_lResult != ERROR_SUCCESS)
  573. return FALSE;
  574. return TRUE;
  575. }
  576. CString str;
  577. str.Format(_T("%i,%i"), pValue->cx, pValue->cy);
  578. BOOL bResult = WriteProfileString(lpszSection, lpszEntry, str);
  579. return bResult;
  580. }
  581. BOOL CXTRegistryManager::GetProfileSize(LPCTSTR lpszSection, LPCTSTR lpszEntry, CSize* szResult)
  582. {
  583. ASSERT(lpszSection != NULL);
  584. ASSERT(lpszEntry != NULL);
  585. if (m_strINIFileName.IsEmpty())
  586. {
  587. if (!GetProfileInfo())
  588. return FALSE;
  589. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  590. if (hSecKey == NULL)
  591. return FALSE;
  592. DWORD dwType, dwCount;
  593. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  594. NULL, &dwCount);
  595. if (m_lResult != ERROR_SUCCESS)
  596. return FALSE;
  597. ASSERT(dwType == REG_BINARY);
  598. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  599. (LPBYTE)szResult, &dwCount);
  600. if (m_lResult != ERROR_SUCCESS)
  601. return FALSE;
  602. ASSERT(dwType == REG_BINARY);
  603. return TRUE;
  604. }
  605. else
  606. {
  607. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  608. // convert to string and write out
  609. CString str = GetProfileString(lpszSection, lpszEntry, NULL);
  610. if (str.IsEmpty())
  611. return FALSE;
  612. SCANF_S(str, _T("%i,%i"), &szResult->cx, &szResult->cy);
  613. return TRUE;
  614. }
  615. }
  616. BOOL CXTRegistryManager::WriteProfileDouble(LPCTSTR lpszSection, LPCTSTR lpszEntry, double* pValue)
  617. {
  618. ASSERT(lpszSection != NULL);
  619. if (m_strINIFileName.IsEmpty())
  620. {
  621. if (!GetProfileInfo())
  622. return FALSE;
  623. CHKey hSecKey(GetSectionKey(lpszSection));
  624. if (hSecKey == NULL)
  625. return FALSE;
  626. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
  627. (LPBYTE)pValue, sizeof(*pValue));
  628. if (m_lResult != ERROR_SUCCESS)
  629. return FALSE;
  630. return TRUE;
  631. }
  632. LPBYTE pData = (LPBYTE) pValue;
  633. UINT nBytes = sizeof(double);
  634. LPTSTR lpsz = new TCHAR[nBytes * 2 + 1];
  635. UINT i;
  636. for (i = 0; i < nBytes; i++)
  637. {
  638. lpsz[i * 2] = (TCHAR)((pData[i] & 0x0F) + 'A'); //low nibble
  639. lpsz[i * 2 + 1] = (TCHAR)(((pData[i] >> 4) & 0x0F) + 'A'); //high nibble
  640. }
  641. lpsz[i * 2] = 0;
  642. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  643. BOOL bResult = WriteProfileString(lpszSection, lpszEntry, lpsz);
  644. delete[] lpsz;
  645. return bResult;
  646. }
  647. BOOL CXTRegistryManager::GetProfileDouble(LPCTSTR lpszSection, LPCTSTR lpszEntry, double* dResult)
  648. {
  649. ASSERT(lpszSection != NULL);
  650. ASSERT(lpszEntry != NULL);
  651. if (m_strINIFileName.IsEmpty())
  652. {
  653. if (!GetProfileInfo())
  654. return FALSE;
  655. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  656. if (hSecKey == NULL)
  657. return FALSE;
  658. DWORD dwType, dwCount;
  659. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  660. NULL, &dwCount);
  661. if (m_lResult != ERROR_SUCCESS)
  662. return FALSE;
  663. ASSERT(dwType == REG_BINARY);
  664. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  665. (LPBYTE)dResult, &dwCount);
  666. if (m_lResult != ERROR_SUCCESS)
  667. return FALSE;
  668. ASSERT(dwType == REG_BINARY);
  669. return TRUE;
  670. }
  671. else
  672. {
  673. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  674. CString str = GetProfileString(lpszSection, lpszEntry, NULL);
  675. if (str.IsEmpty())
  676. return FALSE;
  677. ASSERT(str.GetLength()%2 == 0);
  678. int nLen = str.GetLength();
  679. LPBYTE pData = (LPBYTE) dResult;
  680. int i;
  681. for (i = 0; i < nLen; i += 2)
  682. {
  683. (pData)[i/2] = (BYTE)
  684. (((str[i + 1] - 'A') << 4) + (str[i] - 'A'));
  685. }
  686. return TRUE;
  687. }
  688. }
  689. BOOL CXTRegistryManager::WriteProfileDword(LPCTSTR lpszSection, LPCTSTR lpszEntry, DWORD* pValue)
  690. {
  691. ASSERT(lpszSection != NULL);
  692. if (m_strINIFileName.IsEmpty())
  693. {
  694. if (!GetProfileInfo())
  695. return FALSE;
  696. CHKey hSecKey(GetSectionKey(lpszSection));
  697. if (hSecKey == NULL)
  698. return FALSE;
  699. m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_DWORD,
  700. (LPBYTE)pValue, sizeof(*pValue));
  701. if (m_lResult != ERROR_SUCCESS)
  702. return FALSE;
  703. return TRUE;
  704. }
  705. BOOL bResult = WriteProfileInt(lpszSection, lpszEntry, int(*pValue));
  706. return bResult;
  707. }
  708. BOOL CXTRegistryManager::GetProfileDword(LPCTSTR lpszSection, LPCTSTR lpszEntry, DWORD* dwResult)
  709. {
  710. ASSERT(lpszSection != NULL);
  711. ASSERT(lpszEntry != NULL);
  712. if (m_strINIFileName.IsEmpty())
  713. {
  714. if (!GetProfileInfo())
  715. return FALSE;
  716. CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
  717. if (hSecKey == NULL)
  718. return FALSE;
  719. DWORD dwType, dwCount;
  720. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  721. NULL, &dwCount);
  722. if (m_lResult != ERROR_SUCCESS)
  723. return FALSE;
  724. ASSERT(dwType == REG_DWORD);
  725. m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
  726. (LPBYTE)dwResult, &dwCount);
  727. if (m_lResult != ERROR_SUCCESS)
  728. return FALSE;
  729. ASSERT(dwType == REG_DWORD);
  730. return TRUE;
  731. }
  732. else
  733. {
  734. ASSERT(m_strINIFileName.IsEmpty() == FALSE);
  735. CString str = GetProfileString(lpszSection, lpszEntry, NULL);
  736. if (str.IsEmpty())
  737. return FALSE;
  738. *dwResult = (DWORD)GetProfileInt(lpszSection, lpszEntry, 0);
  739. return TRUE;
  740. }
  741. }
  742. BOOL CXTRegistryManager::WriteProfileColor(LPCTSTR lpszSection, LPCTSTR lpszEntry, COLORREF* pValue)
  743. {
  744. return WriteProfileDword(lpszSection, lpszEntry, pValue);
  745. }
  746. BOOL CXTRegistryManager::GetProfileColor(LPCTSTR lpszSection, LPCTSTR lpszEntry, COLORREF* rgbResult)
  747. {
  748. return GetProfileDword(lpszSection, lpszEntry, rgbResult);
  749. }
  750. CString CXTRegistryManager::GetErrorMessage() const
  751. {
  752. LPVOID lpMsgBuf = 0;
  753. ::FormatMessage(
  754. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  755. FORMAT_MESSAGE_FROM_SYSTEM |
  756. FORMAT_MESSAGE_IGNORE_INSERTS,
  757. NULL,
  758. GetErrorCode(),
  759. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  760. (LPTSTR) &lpMsgBuf,
  761. 0,
  762. NULL
  763. );
  764. CString csMessage((LPCTSTR)lpMsgBuf);
  765. // Free the buffer.
  766. ::LocalFree( lpMsgBuf );
  767. return csMessage;
  768. }