I got several requests by people asking to make my C++ WinReg code (which has been using C++17 in its main branch since many months) compile on older C++14 compilers (like VS 2017 in C++14 mode).
Now you can find the C++14-compatible version in this branch.
To make the code C++14-compatible, among other things, I removed the use of [[nodiscard]], removed std::variant (simply substituted with a couple of data members), and replaced the non-const std::wstring::data() method with &s[0].
Recently I worked on my C++ WinReg library for a couple of hours, adding some useful methods, testing them, and packaging the library for vcpkg distribution.
At a reasonable rate of $150/hour, that would be $300.
And that’s not even counting all the many hours I spent in total on this open-source project.
This library has currently more than 260 stars on GitHub, and many forks. It seems to me it is used by many people.
But who pays for it?
I think there should be some process to allow developers of useful open-source code hosted on GitHub (or on other platforms as well) to be fairly compensated for their work.
The native Windows Registry API is a C-interface API, that is low-level and kind of hard and cumbersome to use.
For example, suppose that you simply want to read a string value under a given key. You would end up writing code like this:
Sample code excerpt to read a string value from the Windows Registry using the native Windows API.
And this is just the part to query the destination string length. Then, you need to allocate a string object with proper size (and pay attention to proper size-in-bytes-to-size-in-wchar_ts conversion!), and after that you can finally read the actual string value into the local string object.
That’s definitely a lot of bug-prone C++ code, and this is just to query a string value!
Moreover, in modern C++ code you should prefer using nice higher-level resource manager classes with automatic resource cleanup, instead of raw HKEY handles.
Fortunately, it’s possible to hide that kind of complex and bug-prone code in a nice C++ library, that offers a much more programmer-friendly interface. This is basically what my C++ WinReg library does.
You can query a string value with just one simple line of C++ code using WinReg.
Just a quick update that my WinReg C++ library (high-level easy-to-use C++ wrapper around the Windows Registry C-interface API) has been added to the vcpkg catalog.
The Windows Registry native C API is very low-level and hard to use.
A while back I developed some convenient higher-level C++ wrappers, that should make Windows Registry programming easier and more fun. You can find them on GitHub.
Just to give you a taste of this C++ WinReg library, you can simply open a registry key with code like this:
I haven’t touched that project in a few months (being very busy), but yesterday I accepted an external contribution and merged a pull request adding a DeleteTree feature.
I take this occasion to thank everyone who showed interest and appreciation for this project.
I uploaded on GitHub some C++ code of mine that wraps some Windows registry C-interface APIs, using RAII, STL classes like std::wstring and std::vector, and signals error conditions using exceptions.
Using these high-level C++ wrappers, you can easily access the Windows registry with simple code like this:
// Open a registry key
RegKey key{
HKEY_CURRENT_USER,
LR"(SOFTWARE\MyKey\SubKey)"
};
// Read a DWORD value
DWORD dw = key.GetDwordValue(L"MyValue1");
// Read a string value
wstring s = key.GetStringValue(L"MyValue2");
// Enumerate the values under the given key
auto values = key.EnumValues();
// etc.
On the May issue of MSDN Magazine you’ll find an article describing some of the techniques applied in this code.