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
.
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");
CString str = mystring;
mystring = "TestValue";
mystring += "!";
myrect = CRect(100,200,300,400);
LPRECT lpR = (LPRECT)myrect;
myword = GetTickCounts();
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:
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 :
- added classes for use without MFC: CRegStdString, CRegStdDWORD
- now compiles for UNICODE too
- 9. July 2002 :
- Corrected a bug found by Hans Dietrich
- Extended the classes with two methods: removeKey() and removeValue()
Daniel Andersson wrote a templatized version of this class. See his article here.