Auch wenn die Frage schon älter ist, werden sicherlich einige noch noch der Lösung suchen (und auf diesen Thread stoßen). Deshalb hier eine einfache Lösung:
Delphi-Quellcode:
RegReadString64(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion','ProgramFilesDir','');
function RegReadString64(MainKey:HKey; SubKey,ValueName,sDefault:string):string;
const KEY_WOW64_64KEY = $0100;
var DType: Integer;
BSize: Integer;
Key:HKey;
a2,a:array[0..MAX_PATH]of char;
p:PChar;
begin
result:=sDefault;
DType := REG_SZ;
BSize:=sizeof(a);
p:=a;
if RegOpenKeyEx(MainKey, PChar(SubKey), 0, KEY_READ or KEY_WOW64_64KEY , Key)<>ERROR_SUCCESS then exit;
if RegQueryValueEx(key,PChar(ValueName),nil,@DType, PByte(p), @BSize) <> ERROR_SUCCESS then begin RegCloseKey(Key); exit; end;
RegCloseKey(Key);
a[BSize]:=#0; //sonst Fehler beim lesen von ''
if DType=REG_EXPAND_SZ then if ExpandEnvironmentStrings(a,a2,sizeof(a2))>0 then StrCopy(a,a2);
result:=StrPas(a);
end;
Tschuldigung für den furchtbaren Code, aber hauptsache es klappt erstmal unter Delphi.
Anmerkung: Der Code klappt erst ab Win7, siehe
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx :
Either KEY_WOW64_32KEY or KEY_WOW64_64KEY can be specified. If both flags are specified, the function fails with ERROR_INVALID_PARAMETER.
Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP: If both flags are specified, the function’s behavior is undefined.