вот пример с сохранением структур из дельфийского исходника стелса.
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 - точно будет работать.