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
ExpandEnvironmentStrings 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;
Ein Therapeut entspricht 1024 Gigapeut.