📄 unit_rcfile.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 + -