000
12.12.2004, 12:30 Uhr
LowFly
|
hy, ich hab ein Problem mit dem auslesen der Ordner aus der Registry. Nach langem code zusammenflicken, bin ich total verwirrt & seh den code vor lauter Buchstaben nicht mehr. Momentan bin ich mit meinem prog soweit, das mir die gesammte Registry durchlaufen wird aber mein prog findet das ende der registry nicht.
Ich hab mir eine Classe CRegistryTreeCtrl erstellt die von der CTreeCtrl abgeleitet wird. In dieser CRegistryTreeCtrl les ich dann die registry mit volgendem code aus.
Code: |
////////////////////////////////////////// //Verweis aus einer anderen void Funktion RefreshKey(HKEY_CURRENT_USER,TVI_ROOT,0);
////////////////////////////////////////////////////////// //Lese Ordner unter dem Angegebene Schlüßel hMasterKey aus void CRegistryTreeCtrl::RefreshKey(HKEY hMasterKey,HTREEITEM hRootItem,int nIndex) { char KeyName[1024]=""; char SubKeyName[1024]=""; BYTE Data[1024]=""; DWORD dwDataSize=sizeof(Data); HKEY hKey; HTREEITEM nextRoot;
//Durchlaufe solange die Schleife solange Ordner (KeyName) unter der //angegbenen Indexzahl (nIndex) gefunden werden. long EnumResult = RegEnumKey(hMasterKey,nIndex,KeyName,dwDataSize); while(EnumResult!=ERROR_NO_MORE_ITEMS) { //////////////////////////////////////////////////// //Für TreeItem Ertsellung macht keine Probleme////// char *cItemText = szString.GetCharStrCpy(KeyName,0); TV_INSERTSTRUCT tvis; ZeroMemory(&tvis,sizeof(TV_INSERTSTRUCT)); tvis.hParent = hRootItem; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_CHILDREN|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; tvis.item.pszText = cItemText; tvis.item.iImage = 1; tvis.item.iSelectedImage = 1; tvis.item.cChildren = TRUE; HTREEITEM hItem = InsertItem( &tvis ); /////////////////////////////////////////////////////
//Versuche nächsten Ordner zu öffnen //ERROR_SUCCESS, ERROR_NO_MORE_ITEMS, NULL if(RegOpenKey(hMasterKey,KeyName, &hKey)!=ERROR_NO_MORE_ITEMS) { //Ist unter dem geöffneten Ordner ein weiterer Ordner vorhanden if(RegEnumKey(hKey,0,SubKeyName,dwDataSize)!=ERROR_NO_MORE_ITEMS) { MessageBox(SubKeyName); //Legt nächste oberste Roote für Tree Eintrag fest nextRoot = hItem; //Starte neue Schleife mit neuem Schlüßel & lese dort die Ordner aus RefreshKey(hKey,nextRoot,0); }//ende if RegEnumKey }//ende if RegOpenKey
nIndex++;//Angewählte Ordner Nr um eins erhöhen EnumResult = RegEnumKey(hMasterKey,nIndex,KeyName,dwDataSize); }//ende while //Schliese den angebenen Schlüßel RegCloseKey(hMasterKey);
}//ende void
|
der fehler das die schleife nicht beendet wird passiert meines erachtens unter
Code: |
if(RegOpenKey(hMasterKey,KeyName, &hKey)!=ERROR_NO_MORE_ITEMS)
|
dort hab ich schon alle varianten eingesetzt die mir so eingefallen sind oder die ich in der msdn gefunden hab. ERROR_SUCCESS, ERROR_NO_MORE_ITEMS, NULL alle mit != oder auch == führen sobald RegOpenKey anspricht weit hinter dem ende der der registry zum absturz.
Mit weit hinter dem ende mein ich, das mir unter MessageBox(SubKeyName) der letzte ordner der registry angezeigt wird, ich dann aber nach dem letzten Ordner noch ~200 lehre SubKeyName bestätigen muß, bis dann eine Fehlermeldung mit einer unbehadelten Ausnahme kommt.
Spricht RegOpenKey nicht an, dann stehn alle Ordner die er unter HKEY_CURRENT_USER findet korrect in der Tree, nur leider halt ohne Unterordner.
Was muß ich jetzt machen um die Schleife zu beenden wenn RegOpenKey anspricht. vielen dank schonmal lowfly |