InstallPath用字符串直接取是乱码的,用二进制查看是正常的,请问这个应该怎么才能读到正常的字符串? 以下是我的代码.Function ToReg:string;
var
  IeCache:array[0..1024] of char;
  IeCacheLen:integer;
  HK:HKEY;
  s:string;
begin
  Result := '';
  IeCacheLen:=1024;
  RegOpenKey(HKEY_LOCAL_MACHINE,'SOFTWARE\FairRain\Open\Setup',HK);
  RegQueryValueEx(HK,PChar('InstallPath'),nil,nil,@IeCache,@ieCacheLen);
  Result := Strpas(IeCache);
end;

解决方案 »

  1.   

    注册表有 ReadBinaryData方法,不会自己百度
      

  2.   

    我用ReadBinaryData也不行 运行到这行就出错啊!!!Reg.ReadBinaryData('InstallPath', P^, DataInfo.DataSize);哪位高人帮忙看下啊!
    var
      Reg: TRegistry;
      P: PByte;
      DataInfo: TRegDataInfo;
    begin
      Reg := TRegistry.Create;
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      Reg.OpenKey('SOFTWARE\FairRain\Open\Setup', False);
      try
        Reg.GetDataInfo('InstallPath', DataInfo);
        GetMem(P, DataInfo.DataSize);
        Reg.ReadBinaryData('InstallPath', P^, DataInfo.DataSize);
        Edit1.Text := PWideChar(P);
      finally
        FreeMem(P);
        Reg.CloseKey;
        Reg.Free;
      end;
    end;
      

  3.   

    楼主你属于头疼医脚的主,你读出乱码也是读取正确了,无非是字符转换的问题,你怎么死磕读取注册表呢,呵呵。在D2010下你把IeCache:array[0..1024] of char; 改成IeCache:array[0..1024] of AnsiChar;就可以正确显示。在D7下稍微改下你的代码就可以
    var
      IeCacheLen:integer;
      HK:HKEY;
      s:UTF8String;
    begin
      RegOpenKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\FairRain\Open\Setup', HK);
      RegQueryValueExW(HK, 'InstallPath', nil, nil, nil, @IeCacheLen);
      SetLength(s, IeCacheLen);
      RegQueryValueExW(HK, 'InstallPath', nil, nil, @s[1], @IeCacheLen);
      RegCloseKey(HK);
      Result:=s;