意图:读取系统中的时区信息的TZI值并写入文件
问题:对比注册表中的值与写入文件的数据,发现两者完全不同
代码:
const
  TIMEZONE_PATH = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Afghanistan Standard Time';
var
  Reg: TRegistry;
  PTZIData: PByte;
  Fs: TFileStream;
  TZIDataSize: Integer;
begin
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.OpenKeyReadOnly(TIMEZONE_PATH);  TZIDataSize := Reg.GetDataSize('TZI');
  GetMem(PTZIData, TZIDataSize);
  
  Reg.ReadBinaryData('TZI', PTZIData^, TZIDataSize);
  Reg.CloseKey;
  Reg.Free;  Fs := TFileStream.Create('c:\aa.txt', fmCreate);
  Fs.Write(PTZIData, TZIDataSize);
  Fs.Free;  FreeMem(PTZIData);
end;

解决方案 »

  1.   

    怎么不一样了,注册表中是二进制数据,txt文本中是转换成的字符,其实都是一样的内容
      

  2.   

    你要写得到二进制的字符串,那就逐个字节去转换Fs 的byte为十六进制字符串
      

  3.   

    您可以把输出的文件名改为c:\aa.dat,然后用UltraEdit或者其它工具打开,并以二进制方式浏览。其实跟是否为Txt文件名无关。
      

  4.   


    const
      TIMEZONE_PATH = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Afghanistan Standard Time';
    var
      Reg: TRegistry;
      PTZIData: PByte;
      strem:TMemoryStream;
      TZIDataSize,len: Integer;
    begin
      strem := TMemoryStream.Create;
      Reg := TRegistry.Create;
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      Reg.OpenKeyReadOnly(TIMEZONE_PATH);  TZIDataSize := Reg.GetDataSize('TZI');
      GetMem(PTZIData, TZIDataSize);
      len := Reg.ReadBinaryData('TZI', PTZIData^, TZIDataSize);
      Reg.CloseKey;
      Reg.Free;
      strem.Write(PTZIData^,len);
      strem.SaveToFile('c:\aa.txt');
      strem.Free;
      FreeMem(PTZIData);
    end;