Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#10

Re: SnowScreenSaver

  Alt 20. Jan 2008, 06:21
wenn du schon auf Try-Finaly verzichtest, dann doch bitte "richtig".


Delphi-Quellcode:
RegOpenKeyEx(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\'
             + 'Explorer\Shell Folders', 0, KEY_READ, hk);
RegQueryValueEx(hk, 'AppData', nil, @RegType, nil, @BufSize);
GetMem(Buf, BufSize);
RegQueryValueEx(hk, 'AppData', nil, @RegType, Buf, @BufSize);
RegCloseKey(hk); // man könnte ja auch ml versuchen den Key
                  // zu schließen, den man auch geöffnet hat ;)
if (RegType = REG_SZ) and (BufSize > 1) then
begin
  SetLength(Txt, BufSize);
  CopyMemory(@Txt[1], Buf, BufSize);
  //FreeMem(Buf); << hier hast du es
  PC := PAnsiChar(Txt);
  Result := PC + '\';
end;
FreeMem(Buf); // << hier wär's besser
sonst wird der Speicher nicht freigegeben, wenn der Eintrag nicht existiert.

ach ja, hat sich Delphi eigentlich nicht wegen des Results gemeldet?
(des kann undefiniert sein)

PS: REG_EXPAND_SZ wäre auch möglich


Delphi-Quellcode:
function TSnowScreen.GetAppData: string;
var
  hk: HKEY;
  RegType: DWord;
  BufSize: Cardinal;
  Buf: PAnsiChar;
begin
  Result := '';
  if RegOpenKeyEx(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\'
    + 'CurrentVersion\Explorer\Shell Folders', 0, KEY_READ, hk) then
  begin
    RegQueryValueEx(hk, 'AppData', nil, @RegType, nil, @BufSize);
    if BufSize > 0 then
    begin
      GetMem(Buf, BufSize);
      RegQueryValueEx(hk, 'AppData', nil, @RegType, Buf, @BufSize);
      if RegType = REG_SZ then Result := IncludeTrailingBackslash(Buf);
      FreeMem(Buf);
    end;
  end;
  RegCloseKey(hk);
end;
aber statt der Registry leg ich dir mal ein MSDN-Library durchsuchenExpandEnvironmentStrings ans Herz.
(wer weiß ob MS den Reg-Pfad nicht irgendwann ändert)
Delphi-Quellcode:
var Buf: array[0..MAX_PATH] of Char;
begin
  ExpandEnvironmentStrings('%AppData%\SnowScreenSaver.cfg', @Buf, MAX_PATH);
  Result := PChar(@Buf);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat