Click here to Skip to main content
Click here to Skip to main content

Another registry class

By , 25 Apr 2003
 

Introduction

In many projects I need to store simple strings, DWORDS or for window position CRect's in the registry. I know there are many registry classes out there, so why one more?

The answer: simplicity. I want to write to the registry as easy as assigning a value to a variable. Like an eeprom variable in neuron controllers (those of you who use those controllers know what I mean). So I wrote exactly such a class.

Usage

So, how to use this class - or better classes. I wrote a separate class for CString, DWORD, CRect and CPoint.

// initialize the variables
CRegString mystring("Software\\Company\\Subkey\\MyString", "defaultvalue");
CRegRect   myrect("Software\\Company\\Subkey\\MyRect", CRect(1,1,1,1));
CRegDWORD  myword("Software\\Company\\Subkey\\mydword", 100, 
                     TRUE, HKEY_LOCAL_MACHINE);
CRegPoint  mypoint("Software\\Company\\Subkey\\mypoint");

// now use those variables
CString str = mystring;     //if registry does not exist, the default value is used
mystring = "TestValue";     //"TestValue" is stored in the registry
mystring += "!";            //now the registry value MyString contains "TestValue!"
myrect = CRect(100,200,300,400);    //store in the registry
LPRECT lpR = (LPRECT)myrect;
myword = GetTickCounts();   //just an example
mypoint = CPoint(0,0);

As you can see, once the CRegXXX object knows to which registry key/value it is assigned to you can use it like any other variable!

To avoid too much access to the registry the value is cached. Writes occur only if the new value is different than the current value. Reads occur only once in the constructor. Since such a cached behaviour could lead to some problems, you can force reads and writes to the registry with the methods read() and write(). To disable the cache and force the class to always access the registry just set that in the constructor. the constructor for the CRegDWORD looks like this:

/**
* Constructor.
* @param key the path to the key, including the key. 
*            example: "Software\\Company\\SubKey\\MyValue"
* @param def the default value used when the key does not exist or 
*            a read error occured
* @param force set to TRUE if no cache should be used, i.e. always read and write 
*              directly from/to registry
* @param base a predefined base key like HKEY_LOCAL_MACHINE. see the SDK 
*             documentation for more information.
*/
CRegDWORD(CString key, DWORD def = 0, BOOL force = FALSE, 
          HKEY base = HKEY_CURRENT_USER);

The classes CRegString, CRegRect and CRegPoint have similar constructors. See the header files for details.

Not all methods of the "base" classes are overloaded. So if you want to, for example, use some methods of the CString class you have to typecast the CRegString to a CString first:

int l = ((CString)mystring).GetLength();
((CString)mystring).Trim();

Please note that in the second line where the Trim() is used that the changed string is NOT written to the registry!

And please: keep your complaints about "not again a registry class" and the like for yourselves. If you don't like it, don't use it!

Update

  • 2. April 2003 :
    1. added classes for use without MFC: CRegStdString, CRegStdDWORD
    2. now compiles for UNICODE too
  • 9. July 2002 :
    1. Corrected a bug found by Hans Dietrich
    2. Extended the classes with two methods: removeKey() and removeValue()

Daniel Andersson wrote a templatized version of this class. See his article here.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

SteveKing
Software Developer
Switzerland Switzerland
Member
---

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5 Pinmemberdespana5 Feb '13 - 11:29 
QuestionBug for Unicode projects? Pinmemberrh_20 Apr '07 - 2:26 
GeneralModified to read REG_MULTI_SZ correctly PinmemberDouglas R. Keesler23 Dec '06 - 4:54 
Generaltab ctrl Pinmemberlocoone2 Sep '06 - 13:29 
GeneralNice... PinmemberHumanJHawkins14 Jun '06 - 11:39 
Generalunicode for registry Pinmemberraycadarena13 Feb '06 - 18:45 
GeneralNeed error handling PinmemberCharlieG28 Jul '05 - 6:08 
GeneralVery nice, thank you a lot! PinmemberAlex Chirokov4 Jul '05 - 16:47 
GeneralConstructor / read problem PinmemberBob Stanneveld13 Apr '05 - 3:08 
Generalerror C2039: 'Trim' : is not a member of 'CString' Pinmemberqiek4 Nov '04 - 5:07 
GeneralRe: error C2039: 'Trim' : is not a member of 'CString' PinmemberEvanTao30 Nov '04 - 0:03 
I think that maybe it's a bug.
 
I think that it maybe should like this:
m_key.TrimLeft(_T("\\"));
 
And i believe it is right with trimleft().
GeneralRe: error C2039: 'Trim' : is not a member of 'CString' PinmemberAlex Chirokov4 Jul '05 - 16:52 
AnswerRe: error C2039: 'Trim' : is not a member of 'CString' PinmemberDouglas R. Keesler23 Dec '06 - 5:30 
Generalexport registry as text file programmatically Pinmemberyamei14 Oct '04 - 12:28 
GeneralLinker error wtih removeKey() PinmemberJR Cooper7 Oct '04 - 13:34 
GeneralRe: Linker error wtih removeKey() Pinmembermnowok12 Oct '04 - 0:07 
Generali can write to the registry, yaay! Pinmemberasmotritsky19 Jun '04 - 23:33 
GeneralUse in DLL that does not use MFC Pinmemberltang724 Apr '04 - 19:01 
General"Simple" is great! PinmemberXeonSniper13 Apr '04 - 17:40 
Generalloading .reg file programmatically Pinmemberbruno leclerc18 Mar '04 - 1:14 
GeneralCRegStdDWORD instead of CRegStdWORD Pinmemberujohnc0016 Mar '04 - 10:11 
GeneralGreat! thank you PinmemberPMartos18 Dec '03 - 9:14 
GeneralFelicidades :) PinmemberC++17 Dec '03 - 8:41 
QuestionBug? PinmemberIgor Vigdorchik16 Dec '03 - 9:29 
AnswerRe: Bug? PinmemberJonas Nordlund5 Feb '04 - 23:50 
GeneralRe: Bug? PinmemberIgor Vigdorchik6 Feb '04 - 18:03 
GeneralDid not compile with VC6 PinmemberJacques Cooper12 Dec '03 - 13:16 
GeneralRe: Did not compile with VC6 PinmemberJonas Nordlund5 Feb '04 - 23:55 
Generalcool code... a lot of thanks and a suggestion... PinmemberpHreak081528 Sep '03 - 4:11 
GeneralGreat PinmemberBEamer18 Sep '03 - 19:32 
GeneralHere's how to read/write to REG_MULTI_SZ Pinmemberunivega_r30410 Aug '03 - 18:13 
GeneralRe: Here's how to read/write to REG_MULTI_SZ Pinsussjfernb3 Jun '04 - 11:07 
GeneralRe: Here's how to read/write to REG_MULTI_SZ Pinmemberunivega_r30422 Dec '04 - 7:15 
GeneralRe: Here's how to read/write to REG_MULTI_SZ PinmemberMoSs.gr3 Nov '04 - 7:56 
GeneralRe: Here's how to read/write to REG_MULTI_SZ Pinmemberfarzadb8 Apr '05 - 12:31 
QuestionHow to use as a member variable? PinmemberSorak26 May '03 - 19:40 
AnswerRe: How to use as a member variable? PinmemberSteveKing26 May '03 - 23:04 
AnswerRe: How to use as a member variable? PinmemberChris Richardson27 May '03 - 16:47 
GeneralBeautiful Pinmember=[ Abin ]=1 Apr '03 - 2:51 
Generala little problem working with UNICODE Pinmembernothingremained10 Nov '02 - 20:16 
GeneralRe: a little problem working with UNICODE PinmemberTDWiseley8 Jan '03 - 14:11 
GeneralTrim PinmemberDins_C10 Sep '02 - 10:20 
GeneralRe: Trim PinmemberSteveKing11 Sep '02 - 3:00 
GeneralCould you help me please! PinsussAnonymous14 Jul '02 - 18:14 
GeneralRe: Could you help me please! PinmemberSteveKing15 Jul '02 - 6:05 
GeneralRe: Could you help me please! Pinmemberunivega_r3049 Aug '03 - 5:25 
GeneralQuestion about new removeKey function PinmemberHans Dietrich10 Jul '02 - 9:36 
GeneralRe: Question about new removeKey function PinmemberSteveKing10 Jul '02 - 21:35 
GeneralVery nice! but one bug... PinmemberHans Dietrich8 Jul '02 - 8:40 
GeneralRe: Very nice! but one bug... PinmemberSteveKing8 Jul '02 - 23:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 26 Apr 2003
Article Copyright 2002 by SteveKing
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid