⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit_rcfile.pas

📁 MIR3登陆器源码 Client 服务端 配置器 配置器生成工具
💻 PAS
字号:
unit Unit_RcFile;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls,DB, DBTables,ShellAPI, ShlObj,Registry,TlHelp32,WinSock;
type
  TRcHeader=packed record
    ServerCount:word;
    UpdateCount:word;
    ExeTitle:String[20];
    ExeVer:String[5];
    ExeType:word;
    PicSize:integer;
    NoticeSize:integer;
    CmlistSize:integer;
  end;
  TServerInfo=packed record
    ServerName:String[13];
    ServerCaption:String[20];
    ServerIp:String[15];
    ServerPort:integer;
    ServerUrl:String[40];
    RegSvrIp:String[15];
    RegSvrPort:Integer;
  end;
  PServerInfo=^TServerInfo;
  TUpDateInfo=packed record
    ServerName:String[20];
    ServerUrl:String[40];
  end;
  PUpdateInfo=^TUpdateInfo;
  TRcFile=Class
  Private
    PicSize:integer;
    NoticeSize:integer;
    CmlistSize:integer;
    function loadHeadinfo:boolean;
  Public
    ServerCount:word;
    UpdateCount:word;
    ExeTitle:string;
    ExeVer:string;
    ExeType:Word;
    ServerInfo:TList;
    UpDateInfo:TList;
    FileName:String;
    constructor Create;
    destructor Destroy;
    procedure CreateRc(Exe_Title,Exe_Ver:String;Exe_Type:word;Tmp_Server_info,Tmp_Update_info:TList;Tmp_Pic:TPicture;Tmp_notice,Tmp_cmlist:TMemoryStream);
    function ReadRc(var Exe_Title:String;var Exe_Ver:String;var Exe_Type:word;var Tmp_Server_info:TList;Var Tmp_Update_info:TList;Var Tmp_Pic:TMemoryStream;var Tmp_Notice:TMemoryStream;var Tmp_Cmlist:TMemoryStream):boolean;
    procedure EncodetoMem(Exe_Title,Exe_Ver:String;Exe_Type:word;Tmp_Server_info,Tmp_Update_info:TList;Tmp_Pic:TPicture;Tmp_notice,Tmp_cmlist:TMemoryStream;Var DestMemo:TMemoryStream);
    function DecodeMem(SourceMemo:TMemoryStream;var Exe_Title:String;var Exe_Ver:String;var Exe_Type:word;var Tmp_Server_info:TList;Var Tmp_Update_info:TList;Var Tmp_Pic:TMemoryStream;var Tmp_Notice:TMemoryStream;var Tmp_Cmlist:TMemoryStream):boolean;
  end;
  function EncodeStr(temp:string;Key:integer):String;
  function StrToIp(Str:String):String;
implementation



function EncodeStr(temp:string;Key:integer):String;
var
  i:integer;
begin
  SetLength(Result,length(temp));
  for i:= 1 to length(temp) do
  begin
    Result[i] := chr(byte(temp[i]) xor Key);
  end;
end;

Function StrToIp(Str:String):String;
var
  ip,ip1,ip2,ip3,ip4:string;
begin
  ip1:=Trim(Copy(Str,1,3));
  ip2:=Trim(Copy(Str,5,3));
  ip3:=Trim(Copy(Str,9,3));
  ip4:=Trim(Copy(Str,13,3));
  if ip1+ip2+ip3+ip4<>'' then
  begin
    Try
      if (StrToInt(ip1)<0) or (StrToInt(ip1)>255) then ip1:='255';
      if (StrToInt(ip2)<0) or (StrToInt(ip2)>255) then ip2:='255';
      if (StrToInt(ip3)<0) or (StrToInt(ip3)>255) then ip3:='255';
      if (StrToInt(ip4)<0) or (StrToInt(ip4)>255) then ip4:='255';
      Ip:=ip1+'.'+ip2+'.'+ip3+'.'+ip4;
    except
      ip:='';
    end;
  end
  else ip:='';
  Result:=ip;
end;


constructor TRcFile.Create;
begin
  inherited Create;
  ExeTitle:='';
  ExeVer:='';
  ExeType:=0;
  ServerCount:=0;
  UpdateCount:=0;
  ServerInfo:=TList.Create;
  UpDateInfo:=TList.Create;
end;

destructor TRcFile.Destroy;
begin
   inherited Destroy;
   ServerInfo.Free;
   UpDateInfo.Free;
end;

procedure TRcFile.CreateRc(Exe_Title,Exe_Ver:String;Exe_Type:word;Tmp_Server_info,Tmp_Update_info:TList;Tmp_Pic:TPicture;Tmp_notice,Tmp_cmlist:TMemoryStream);
var
  fhandle:integer;
  header:TRcHeader;
  Tmp_Server:PServerInfo;
  Tmp_Update:PUpdateInfo;
  i:integer;
  Rc_Memo,Pic_Memo,Dest_Memo:TMemoryStream;
begin
  Pic_Memo:=TMemoryStream.Create;
  Rc_Memo:=TMemoryStream.Create;
  Dest_Memo:=TMemoryStream.Create;
  Tmp_Pic.Graphic.SaveToStream(Pic_Memo);
  header.ExeTitle:=Exe_Title;
  header.ExeVer:=Exe_Ver;
  header.ExeType:=Exe_Type;
  header.ServerCount:=Tmp_Server_info.Count;
  header.UpdateCount:=Tmp_Update_info.Count;
  header.PicSize:=Pic_Memo.Size;
  header.NoticeSize:=Tmp_notice.Size;
  header.CmlistSize:=Tmp_cmlist.Size;
  fhandle:=FileCreate(FileName);
  if fhandle>0 then
  begin
    FileWrite(fhandle,header,sizeof(TRcHeader));
    for i:=0 to Tmp_Server_info.Count-1 do
    begin
      New(Tmp_Server);
      Tmp_Server:=PServerInfo(Tmp_Server_info[i]);
      FileWrite(fhandle,Tmp_Server^,sizeof(TServerInfo));
    end;
    for i:=0 to Tmp_Update_info.Count-1 do
    begin
      New(Tmp_Update);
      Tmp_Update:=PUpdateInfo(Tmp_Update_info[i]);
      FileWrite(fhandle,Tmp_Update^,sizeof(TUpdateInfo));
    end;
    FileClose (fhandle);
    Rc_Memo.LoadFromFile(FileName);
    Dest_Memo.SetSize(Rc_Memo.Size+Pic_Memo.size+Tmp_notice.Size+Tmp_cmlist.Size);
    Dest_Memo.Position:=0;
    Rc_Memo.Position:=0;
    Pic_Memo.Position:=0;
    Tmp_notice.Position:=0;
    Tmp_cmlist.Position:=0;
    Dest_Memo.CopyFrom(Rc_Memo,Rc_Memo.Size);
    Dest_Memo.CopyFrom(Pic_Memo,Pic_Memo.Size);
    Dest_Memo.CopyFrom(Tmp_notice,Tmp_notice.Size);
    Dest_Memo.CopyFrom(Tmp_cmlist,Tmp_cmlist.Size);
    Dest_Memo.SaveToFile(FileName);
    Rc_Memo.Free;
    Pic_Memo.Free;
    Dest_Memo.Free;
  end
  else FileClose (fhandle);
end;

function TRcFile.loadHeadinfo:boolean;
var
  fhandle:integer;
  header:TRcHeader;
begin
  Result:=False;
  if FileExists(filename) then
  begin
    fhandle := FileOpen (filename, fmOpenRead or fmShareDenyNone);
    if fhandle> 0 then
    begin
      FileRead (fhandle, header, sizeof(TRcheader));
      ServerCount:=header.ServerCount;
      UpdateCount:=header.UpdateCount;
      ExeTitle:=header.ExeTitle;
      ExeVer:=header.ExeVer;
      ExeType:=header.ExeType;
      PicSize:=header.PicSize;
      NoticeSize:=header.NoticeSize;
      CmlistSize:=header.CmlistSize;
      result:=true;
    end;
    FileClose (fhandle);
  end;
end;

function TRcFile.ReadRc(var Exe_Title:String;var Exe_Ver:String;var Exe_Type:word;var Tmp_Server_info:TList;Var Tmp_Update_info:TList;Var Tmp_Pic:TMemoryStream;var Tmp_Notice:TMemoryStream;var Tmp_Cmlist:TMemoryStream):boolean;
var
  Server_Count,Update_Count,i:integer;
  Tmp_Server:PServerInfo;
  Tmp_Update:PUpdateInfo;
  fhandle:integer;
  header:TRcHeader;
  Rc_Memo:TMemoryStream;
begin
  Result:=False;
  if FileExists(filename) then
  begin
    Tmp_Server_info.Clear;
    Tmp_Update_info.Clear;
    fhandle := FileOpen (filename, fmOpenRead or fmShareDenyNone);
    if fhandle> 0 then
    begin
      FileRead (fhandle, header, sizeof(TRcheader));
      Server_Count:=header.ServerCount;
      Update_Count:=header.UpdateCount;
      Exe_Title:=header.ExeTitle;
      Exe_Ver:=header.ExeVer;
      Exe_Type:=header.ExeType;
      PicSize:=header.PicSize;
      NoticeSize:=header.NoticeSize;
      CmlistSize:=header.CmlistSize;
      for i:=0 to Server_Count-1 do
      begin
        New(Tmp_Server);
        FileRead(fhandle,Tmp_Server^,Sizeof(TServerInfo));
        Tmp_Server_info.Add(Tmp_Server);
      end;
      for i:=0 to Update_Count-1 do
      begin
        New(Tmp_Update);
        FileRead(fhandle,Tmp_Update^,Sizeof(TUpdateInfo));
        Tmp_Update_info.Add(Tmp_Update);
      end;
      FileClose(fhandle);
      Rc_Memo:=TMemoryStream.Create;
      Rc_Memo.LoadFromFile(FileName);
      Tmp_Pic.SetSize(PicSize);
      Rc_Memo.Position:=Rc_Memo.Size-PicSize-NoticeSize-CmlistSize;
      Tmp_Pic.CopyFrom(Rc_Memo,PicSize);
      Rc_Memo.Position:=Rc_Memo.Size-NoticeSize-CmlistSize;
      Tmp_Notice.CopyFrom(Rc_Memo,NoticeSize);
      Rc_Memo.Position:=Rc_Memo.Size-CmlistSize;
      Tmp_Cmlist.CopyFrom(Rc_Memo,CmlistSize);
      Rc_Memo.Free;
      Result:=True;
    end
    else FileClose (fhandle);
  end;
end;

procedure TRcFile.EncodetoMem(Exe_Title,Exe_Ver:String;Exe_Type:word;Tmp_Server_info,Tmp_Update_info:TList;Tmp_Pic:TPicture;Tmp_notice,Tmp_cmlist:TMemoryStream;Var DestMemo:TMemoryStream);
var
  header:TRcHeader;
  Tmp_Server:PServerInfo;
  Tmp_Update:PUpdateInfo;
  i:integer;
  Tmp_Memo,Pic_Memo:TMemoryStream;
begin
  Tmp_Memo:=TMemoryStream.Create;
  Pic_Memo:=TMemoryStream.Create;
  Tmp_Pic.Graphic.SaveToStream(Pic_Memo);
  PicSize:=Pic_Memo.Size;
  Tmp_Memo.SetSize(Sizeof(TRcHeader)+Tmp_Server_info.Count*Sizeof(TServerInfo)+Tmp_Update_info.Count*Sizeof(TUpdateInfo));
  Tmp_Memo.Position:=0;
  header.ExeTitle:=EncodeStr(Exe_Title,Sizeof(TRcHeader));
  header.ExeVer:=EncodeStr(Exe_Ver,Sizeof(TRcHeader));
  header.ExeType:=Exe_Type xor Sizeof(TRcHeader);
  header.ServerCount:=Tmp_Server_info.Count xor Sizeof(TRcHeader);
  header.UpdateCount:=Tmp_Update_info.Count xor Sizeof(TRcHeader);
  header.PicSize:=PicSize xor Sizeof(TRcHeader);
  header.NoticeSize:=Tmp_notice.Size xor Sizeof(TRcHeader);
  header.CmlistSize:=Tmp_cmlist.Size xor Sizeof(TRcHeader);
  Tmp_Memo.Write(header,sizeof(TRcHeader));
  for i:=0 to Tmp_Server_info.Count-1 do
  begin
    New(Tmp_Server);
    Tmp_Server.ServerName:=EncodeStr(PServerinfo(Tmp_Server_info[i]).ServerName,PicSize);
    Tmp_Server.ServerCaption:=EncodeStr(PServerinfo(Tmp_Server_info[i]).ServerCaption,PicSize);
    Tmp_Server.ServerIp:=EncodeStr(PServerinfo(Tmp_Server_info[i]).ServerIp,PicSize);
    Tmp_Server.ServerUrl:=EncodeStr(PServerinfo(Tmp_Server_info[i]).ServerUrl,PicSize);
    Tmp_Server.ServerPort:=PServerinfo(Tmp_Server_info[i]).ServerPort xor PicSize;
    Tmp_Server.RegSvrIp:=EncodeStr(PServerinfo(Tmp_Server_info[i]).RegSvrIp,PicSize);
    Tmp_Server.RegSvrPort:=PServerinfo(Tmp_Server_info[i]).RegSvrPort xor PicSize;
    Tmp_Memo.Write(Tmp_Server^,Sizeof(TServerInfo));
  end;
  for i:=0 to Tmp_Update_info.Count-1 do
  begin
    New(Tmp_Update);
    Tmp_Update.ServerName:=EncodeStr(PUpdateinfo(Tmp_Update_info[i]).ServerName,PicSize);
    Tmp_Update.ServerUrl:=EncodeStr(PUpdateinfo(Tmp_Update_info[i]).ServerUrl,PicSize);
    Tmp_Memo.Write(Tmp_Update^,Sizeof(TUpdateInfo));
  end;
  DestMemo.SetSize(Tmp_Memo.Size+Pic_Memo.size+Tmp_notice.Size+Tmp_cmlist.Size);
  DestMemo.Position:=0;
  Tmp_Memo.Position:=0;
  Pic_Memo.Position:=0;
  Tmp_notice.Position:=0;
  Tmp_cmlist.Position:=0;
  DestMemo.CopyFrom(Tmp_Memo,Tmp_Memo.Size);
  DestMemo.CopyFrom(Pic_Memo,Pic_Memo.Size);
  DestMemo.CopyFrom(Tmp_notice,Tmp_notice.Size);
  DestMemo.CopyFrom(Tmp_cmlist,Tmp_cmlist.Size);
  Tmp_Memo.Free;
  Pic_Memo.Free;
end;

function TRcFile.DecodeMem(SourceMemo:TMemoryStream;var Exe_Title:String;var Exe_Ver:String;var Exe_Type:word;var Tmp_Server_info:TList;Var Tmp_Update_info:TList;Var Tmp_Pic:TMemoryStream;var Tmp_Notice:TMemoryStream;var Tmp_Cmlist:TMemoryStream):boolean;
var
  RcSize,DestSize:integer;
  header:TRcHeader;
  Tmp_Server:PServerInfo;
  Tmp_Update:PUpdateInfo;
  Server_Count,Update_Count,i:integer;
begin
  Result:=False;
  DestSize:=SourceMemo.Size;
  SourceMemo.Position:=0;
  SourceMemo.Read(header,Sizeof(TRcHeader));
  Exe_Title:=EncodeStr(header.ExeTitle,Sizeof(TRcHeader));
  Exe_Ver:=EncodeStr(header.ExeVer,Sizeof(TRcHeader));
  Exe_Type:=header.ExeType xor Sizeof(TRcHeader);
  Server_Count:=header.ServerCount xor Sizeof(TRcHeader);
  Update_Count:=header.UpdateCount xor Sizeof(TRcHeader);
  PicSize:=header.PicSize xor Sizeof(TRcHeader);
  NoticeSize:=header.NoticeSize xor Sizeof(TRcHeader);
  CmlistSize:=header.CmlistSize xor Sizeof(TRcHeader);
  for i:=0 to Server_Count-1 do
  begin
    New(Tmp_Server);
    SourceMemo.Read(Tmp_Server^,Sizeof(TServerInfo));
    Tmp_Server.ServerName:=EncodeStr(Tmp_Server.ServerName,PicSize);
    Tmp_Server.ServerCaption:=EncodeStr(Tmp_Server.ServerCaption,PicSize);
    Tmp_Server.ServerIp:=EncodeStr(Tmp_Server.ServerIp,PicSize);
    Tmp_Server.ServerUrl:=EncodeStr(Tmp_Server.ServerUrl,PicSize);
    Tmp_Server.ServerPort:=Tmp_Server.ServerPort xor PicSize;
    Tmp_Server.RegSvrIp:=EncodeStr(Tmp_Server.RegSvrIp,PicSize);
    Tmp_Server.RegSvrPort:=Tmp_Server.RegSvrPort xor PicSize;
    Tmp_Server_info.Add(Tmp_Server);
  end;
  for i:=0 to Update_Count-1 do
  begin
    New(Tmp_Update);
    SourceMemo.Read(Tmp_Update^,Sizeof(TUpdateInfo));
    Tmp_Update.ServerName:=EncodeStr(Tmp_Update.ServerName,PicSize);
    Tmp_Update.ServerUrl:=EncodeStr(Tmp_Update.ServerUrl,PicSize);
    Tmp_Update_info.Add(Tmp_Update);
  end;
  Tmp_Pic.SetSize(PicSize);
  SourceMemo.Position:=SourceMemo.Size-PicSize-NoticeSize-CmlistSize;
  Tmp_Pic.CopyFrom(SourceMemo,PicSize);
  Tmp_Notice.SetSize(NoticeSize);
  SourceMemo.Position:=SourceMemo.Size-NoticeSize-CmlistSize;
  Tmp_Notice.CopyFrom(SourceMemo,NoticeSize);
  Tmp_Cmlist.SetSize(CmlistSize);
  SourceMemo.Position:=SourceMemo.Size-CmlistSize;
  Tmp_Cmlist.CopyFrom(SourceMemo,CmlistSize);
  Result:=True;
end;



end.



















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -