THardWare_Info=record  //硬件信息
    HW_Name:string[255];//硬件名称
    HW_Content:array [0..1000] of char;//硬件描述
  end;  
HardWare_InfoArray: array of THardWare_Info;function TMainFrm.SetHardWareInfoBuffer(AThread: TIdPeerThread): boolean;
var
  HardWare_InfoArray: array of THardWare_Info;
  CountNumber, i: integer;
begin
  with   AThread.Connection do
  begin
      GetHardWare_InfoCount(CountNumber);
        OpenWriteBuffer;
        try
        Writeinteger(CountNumber);
        if  CountNumber>0 then
        begin
          setlength(HardWare_InfoArray, CountNumber);
          GetHardWare_Info(HardWare_InfoArray); //从注册表中读的信息加入列表,在转移到结构体中
        for i := 0 to CountNumber - 1 do
        begin
          WriteBuffer(HardWare_InfoArray[i], Sizeof(HardWare_InfoArray[i]), False);
        end;
        end;
    //    CancelWriteBuffer;
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        raise;
      end;
在段程序中到CloseWriteBuffer;时报错!http://photos.gznet.com/photos/1119203/1119203-GHCwmtdfna.JPG请指教!

解决方案 »

  1.   


    我这段代码有问题吗!
    procedure TMainFrm.GetClassDevice(var TName, TTypeInfo: TStringList);
     //取得硬盘和光驱型号
    var
     i, j: integer;
     sTempl, sTemp2, sTemp3: TStringList;
     SML1, SML2,STemp: string;
     Registry: TRegistry;
    const
     rv = 'DriverDesc';
     rk = 'HARDWARE\DEVICEMAP\Scsi';
    begin
     Registry := TRegistry.Create;
     sTempl := TStringList.Create;
     try
       with Registry do
       begin
         rootkey := HKEY_LOCAL_MACHINE;
         if openkey(rk, False) then
         begin
           getkeynames(sTempl);
           closekey;
           sTemp2 := TStringList.Create;
           sTemp3 := TStringList.Create;
           for i := 0 to sTempl.Count - 1 do
             if openkey(rk + '\' + sTempl[i] + '\Scsi Bus 0', False) then
             begin
               SML1 := sTempl[i];
               getkeynames(sTemp2);
               closekey;
               for j := 0 to sTemp2.Count - 1 do
               begin
                 SML2 := rk + '\' + SML1 + '\Scsi Bus 0\' + sTemp2[j];
                 if openkey(SML2, False) then
                 begin
                   getkeynames(sTemp3);
                   closekey;
                   if sTemp3.Count <> 0 then
                   begin
                     openkey(SML2 + '\Logical Unit Id 0', False);
                     if valueexists('Identifier') then
                     begin
                       STemp := ReadString('Identifier');
                       TName.Add(STemp);
                     end;
                     if valueexists('Type') then
                     begin
                       STemp := ReadString('Type');
                       if STemp = 'DiskPeripheral' then
                         TTypeInfo.Add('硬盘驱动器')
                       else if STemp = 'CdRomPeripheral' then
                         TTypeInfo.Add('光盘驱动器')
                       else
                         TTypeInfo.Add('未知驱动器')
                     end;
                     closekey;
                   end;
                 end;                 // break;
               end;
             end;
         end;
       end;
     finally
       if Assigned(Registry) then
         Registry.Free;
       if Assigned(sTempl) then
         sTempl.Free;
       if Assigned(sTemp2) then
         sTemp2.Free;
       if Assigned(sTemp3) then
         sTemp3.Free;
     end;
    end;
     SLTempType:= TStringList.Create;
     SLTempDecs := TStringList.Create;
     try
       GetClassDevice(SLTempDecs, SLTempType);
       for k := 0 to SLTempDecs.Count - 1 do
       begin
         j := j + 1;
         HardWare_InfoArray[j].HW_Name := SLTempType[k];
         STemp := SLTempDecs[k];
         for  i := 0 to length(STemp) - 1 do
         begin
           HardWare_InfoArray[j].HW_Content[i] := STemp[i + 1];
         end;
       end;
     finally
       if Assigned(SLTempDecs) then      SLTempDecs.Free; //这边出错
       if Assigned(SLTempType) then      SLTempType.Free;//这边出错why end;