Walking The Registry Tree
Initialization of the Walk Registry Tree Dialog
Well, it took a long darn time to get here, but we finally understand all the constituent parts of the Walk Registry Tree page, and it's time to initialize it. First, we initialize the RAPI subsystem with a call to RapiInit(). We call the balancing RapiUninit() in the destructor for the CWalkReg() class.
BOOL CWalkReg::OnInitDialog() { CImageList *pImageList; CBitmap bitmap; CRapiDemoApp *pApp; HKEY hKey; LONG rc; HRESULT hr = CeRapiInit(); if ( hr != ERROR_SUCCESS ) { return FALSE; }
The next few lines are commented, but included here for the following reason. As you've noticed if you've built and run the RapiDemo program over a serial link, it takes a long time to initialize the tree control that displays the registry. For this reason, we only show one of the root Registry hierarchies in RapiDemo's tree control. However, in any practical application, you'd probably want to see the whole Registry, not just the shortest tree, and most likely you'd have an Ethernet link, so the performance issue would be moot. The following commented lines show the HKEY constants you'd use if you wanted to open and traverse all of the Registry hierarchy, along with properly formatted tree control captions.
/* CString szBaseKeys[4]; HKEY hRootKeys[4]; szBaseKeys[0]= _T("HKEY_CLASSES_ROOT"); szBaseKeys[1]= _T("HKEY_CURRENT_USER"); szBaseKeys[2]= _T("HKEY_LOCAL_MACHINE"); szBaseKeys[3]= _T("HKEY_USERS"); hRootKeys[0]= HKEY_CLASSES_ROOT; hRootKeys[1]= HKEY_CURRENT_USER; hRootKeys[2]= HKEY_LOCAL_MACHINE; hRootKeys[3]= HKEY_USERS; */
CPropertyPage::OnInitDialog(); // let the base class do the // default work pImageList = new CImageList(); pImageList->Create(16, 16, ILC_COLOR, 2, 0);
Next, we load a single bitmap resource, which contains both image bitmaps. We add the bitmaps to the image list, and delete the bitmap object. Because we allocated the image list on the heap with new, we use delete to dispose of it in the destructor for this class.
bitmap.LoadBitmap(IDB_FOLDER_BITMAPS); pImageList->Add(&bitmap, (CBitmap * )NULL); bitmap.DeleteObject();
Next, we set the image list in the tree control. The parameters to SetImageList() are a pointer to the initialized image list object and a flag that means that these images are to be used as tree item icons.
m_RegTree.SetImageList(pImageList, TVSIL_NORMAL);
Now, we open one of the four root Registry keys, HKEY_CURRENT_USER.
rc = CeRegOpenKeyEx(HKEY_CURRENT_USER, NULL, 0, KEY_ALL_ACCESS, &hKey ); if( rc != ERROR_SUCCESS ) { return FALSE; }
We get a count of the children for this key, calling CeRegQueryInfoKey().
// query for count of children DWORD dwNumChildren; CeRegQueryInfoKey (HKEY_CURRENT_USER, NULL, NULL, 0, &dwNumChildren, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
Now, we insert the root key in the tree view, calling the CWalkReg member InsertTreeItem(), and capture the handle to the tree item it returns.
m_rghItem = InsertTreeItem( NULL, "HKEY_CURRENT_USER", 0, dwNumChildren, hKey );
If the key has children, we call WalkRegTree(), which will recursively walk out the Registry tree, adding and initializing tree control items as it goes.
if( dwNumChildren > 0 ) { WalkRegTree( hKey, m_rghItem ); } return FALSE; }
Looking Ahead
In the next article, we'll use RAPI to find databases on the remote machine. In particular, you'll see how to find and manipulate the native databases for CE integrated applications.
About the Author
Nancy Nicolaisen is a software engineer who has designed and implemented highly modular Windows CE products that include features such as full remote diagnostics, CE-side data compression, dynamically constructed user interface, automatic screen size detection, and entry time data validation.
In addition to writing for Developer.com, she has written several books, including Making Win 32 Applications Mobile.
# # #
Page 2 of 2