Das vorige Kapitel zeigte, wie man die Schlüsselnamen mit einem festen Puffer auslesen kann. Als Ergänzung wollen wir uns nun kurz die Funktion
Das Beispielprogramm verwendet diese Funktion aber auch, um die Anzahl der vorhandenen Schlüssel für die Fortschrittsanzeige zu ermitteln. Immerhin soll der Anwender ja merken, dass noch etwas passiert.
Weil uns nicht alle Parameter dieser Funktion interessieren, benötigen wir hier lediglich zwei dword-Variablen für die Anzahl der Schlüssel und die Anzahl der Zeichen im längsten Schlüsselnamen:
if(RegQueryInfoKey(rgHandle,nil,nil,nil,@count,@pBufLen,nil,
nil,nil,nil,nil,nil) <> ERROR_SUCCESS) or
(count = 0) then goto Stop;
In diesem Fall wäre "pBufLen" die Variable, die die Zeichenanzahl des längsten Schlüsselnamens aufnimmt. Diesen Wert nutzen wir nun und reservieren entsprechend Speicher:
GetMem(pBuf,pBufLen+1); try { ... } finally FreeMem(pBuf,pBufLen+1); end;
Der Rest ähnelt dann wieder der Vorgehensweise beim festen Puffer (s. hier). Ich spare mir daher die nochmalige Beschreibung. Außerdem demonstriert Ihnen das Beispielprogramm die dynamische Variante.
Werfen wir daher noch kurz einen Blick auf die Variable "count", die im Beispiel die Anzahl der Schlüssel enthält. Dieser Wert wird für die Fortschrittsanzeige benötigt. Dazu erzeugt das Programm schlicht einen kleinen Dialog, der nur einen Progressbar enthält. An den senden wir nur die Nachricht "PBM_SETPOS" und übermitteln dabei die aktuelle Position (in der Variablen "i") und die maximale Anzahl:
SendDlgItemMessage(dlg,130,PBM_SETPOS, MulDiv(i,100,count),0);
Mit dieser Frage beschäftigen wir uns im Kapitel Schlüssel kopieren bzw. verschieben zu einem späteren Zeitpunkt.