вот пример с сохранением структур из дельфийского исходника стелса.
Code: Select all
type TShard_v_5 = record     
    ShardName : String[50];
    IP : String[49];
    Port : Cardinal;
    UseProxy : Boolean;
    ProxyIP : String[15];
    ProxyPort : Word;
    ProxyAuthMethod : Byte;
    ProxyAuthLogin : String[48];
    TooltipDelay : Word;
    ProxyAuthPass : String[48];
    EnableRazorSupport : Boolean;
    ProxyType : Byte;
    EncryptionEnabled : Boolean;
    Ver : TClientVer;
    UOMULPath : String[255];
    SelClient : Byte;
    NulTargets : boolean;
  end; 
PShard_v_5 = ^TShard_v_5;
var   filehwnd : HWND;
ShardData : TShard_v_5;
WriteBytes, wb : Cardinal;
  WriteResult : Boolean;
  filehwnd  := CreateFile(pChar(ShardsPath), GENERIC_WRITE, 0, Nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if (filehwnd = INVALID_HANDLE_VALUE) then
  begin
    AddToLog("System", MSG_GLOBALSETUP_ERROR, "Error with opening: INVALID HANDLE VALUE");
    Exit;
  end;
  //Если файл открыли нормально, то начинаем записывать
      ShardData := PShard_v_5 (ShardsList.Items[i])^;
      //Далее сама запись
      while (WriteBytes < BlockSize) do
      begin
        WriteResult := WriteFile(filehwnd, ShardData^, BlockSize, wb, Nil);
        if not WriteResult then
        begin
          MessageBox(Application.Handle, 'Error with saving shards. WriteResult = False.', 'Save shards error', MB_OK);
          CloseHandle(filehwnd);
          Exit;
        end;
        if (wb = 0) then
        begin
          MessageBox(Application.Handle, 'Error with saving shards. WB = 0.', 'Save shards error', MB_OK);
          CloseHandle(filehwnd);
          Exit;
        end;
        WriteBytes := WriteBytes + wb;
      end;
  CloseHandle(filehwnd);
и это отличный пример того, как делать не надо.
Надо как-то так (переписал 10 минут назад код):
Code: Select all
  procedure SaveShardsList(savefilename : string = 'shards.dat');
var i : Integer;
  ShardData : TShard_v_5;
  ShardsPath : String;
  filestr : TFileStream;
  WriteResult : Boolean;
  ShardsVersion : Cardinal;
  mode : Word;
begin
  if ShardsList.Count = 0 then Exit;
  ShardsPath := StealthPath + savefilename;
  if FileExists( savefilename) then
    mode := fmOpenReadWrite or fmShareDenyWrite
  else
    mode := fmCreate;
  try
    filestr := TFileStream.Create(savefilename,mode);
  except
    Exit;
  end;
  //Если файл открыли нормально, то начинаем записывать
  //Сначала запишем версию сохраняемых данных
  ShardsVersion := 5;
  if filestr.Write(ShardsVersion,4) <> 4 then
  begin
    MessageBox(Application.Handle, 'Error with saving shards. ShardsVersion not written', 'Save shards error', MB_OK);
    filestr.Free;
    Exit;
  end;
  if (ShardsList.Count > 0) then
  for i := 0 to ShardsList.Count - 1 do
  begin
    ShardData := PShard_v_5 (ShardsList.Items[i])^;
    //Далее сама запись
    WriteResult := filestr.Write(ShardData,SizeOf(TShard_v_5)) = SizeOf(TShard_v_5);
    if not WriteResult then
    begin
      MessageBox(Application.Handle, 'Error with saving shards. WriteResult = False.', 'Save shards error', MB_OK);
      filestr.Free;
      Exit;
    end;
  end;
  filestr.Free;
end;
понятия не имею, как оно будет вести себя на ПС, но на 6м стелсе, где вместо ПС встроен PAX - точно будет работать.