RegQueryInfoKey, ... enumerieren zum Zweiten ...


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 RegQueryInfoKey ansehen, die wir bei der dynamischen Variante benötigen.
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);



Und was ist mit den Werten in einem Schlüssel?

Mit dieser Frage beschäftigen wir uns im Kapitel Schlüssel kopieren bzw. verschieben zu einem späteren Zeitpunkt.