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;
var
VerCode:int64;
NoticeMemo,CmlistMemo:TMemoryStream;procedure TFrmMain.FormCreate(Sender: TObject);
var
IniFile:Tinifile;
i,ServerCount:integer;
Tmp_Server:PServerInfo;
begin
NoticeMemo:=TMemoryStream.Create;
CmlistMemo:=TMemoryStream.Create;
VerCode:=0;
Select_idx:=-1;
ServerS:=TList.Create;
Updates:=TList.Create;
AppPath:=ExtractFilePath(Application.ExeName);
ReadFileInfo(ExeTitle,ExeVer,ExeType,ServerS,Updates,NoticeMemo,CmlistMemo);
//通過上句代碼可以得到ExeTitle , ExeVer , ServerS Updates , NoticeMemo,CmlistMemo
end//===============================================================================
Function ReadFileInfo(var Exe_Title:String;var Exe_Ver:String;var Exe_Type:word;var Tmp_Server_info:TList;Var Tmp_Update_info:TList;Var Tmp_Notice:TMemoryStream;Var Tmp_Cmlist:TMemoryStream):Boolean;
var
Source_Memo,Rc_Memo:TMemoryStream;
SourceSize,RcSize:integer;
RcFile:TRcFile;
begin
try
try
Source_Memo:=TMemoryStream.Create;
Rc_Memo:=TMemoryStream.Create;
SourceSize:=1222144; //1222144不知何意
Source_Memo.LoadFromFile(Application.ExeName);
RcSize:=Source_Memo.Size-SourceSize;
Rc_Memo.SetSize(RcSize);
Source_Memo.Seek(SourceSize,soFromBeginning);
Rc_Memo.CopyFrom(Source_Memo,RcSize);
Rc_Memo.Position:=0;
RcFile:=TRcFile.Create;
RcFile.DecodeMem(Rc_Memo,Exe_Title,Exe_Ver,Exe_Type,Tmp_Server_info,Tmp_Update_info,Pic_Memo,Tmp_Notice,Tmp_Cmlist);
RcFile.Free;
finally
Source_Memo.Free;
Rc_Memo.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
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;;
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;
var
VerCode:int64;
NoticeMemo,CmlistMemo:TMemoryStream;procedure TFrmMain.FormCreate(Sender: TObject);
var
IniFile:Tinifile;
i,ServerCount:integer;
Tmp_Server:PServerInfo;
begin
NoticeMemo:=TMemoryStream.Create;
CmlistMemo:=TMemoryStream.Create;
VerCode:=0;
Select_idx:=-1;
ServerS:=TList.Create;
Updates:=TList.Create;
AppPath:=ExtractFilePath(Application.ExeName);
ReadFileInfo(ExeTitle,ExeVer,ExeType,ServerS,Updates,NoticeMemo,CmlistMemo);
//通過上句代碼可以得到ExeTitle , ExeVer , ServerS Updates , NoticeMemo,CmlistMemo
end//===============================================================================
Function ReadFileInfo(var Exe_Title:String;var Exe_Ver:String;var Exe_Type:word;var Tmp_Server_info:TList;Var Tmp_Update_info:TList;Var Tmp_Notice:TMemoryStream;Var Tmp_Cmlist:TMemoryStream):Boolean;
var
Source_Memo,Rc_Memo:TMemoryStream;
SourceSize,RcSize:integer;
RcFile:TRcFile;
begin
try
try
Source_Memo:=TMemoryStream.Create;
Rc_Memo:=TMemoryStream.Create;
SourceSize:=1222144; //1222144不知何意
Source_Memo.LoadFromFile(Application.ExeName);
RcSize:=Source_Memo.Size-SourceSize;
Rc_Memo.SetSize(RcSize);
Source_Memo.Seek(SourceSize,soFromBeginning);
Rc_Memo.CopyFrom(Source_Memo,RcSize);
Rc_Memo.Position:=0;
RcFile:=TRcFile.Create;
RcFile.DecodeMem(Rc_Memo,Exe_Title,Exe_Ver,Exe_Type,Tmp_Server_info,Tmp_Update_info,Pic_Memo,Tmp_Notice,Tmp_Cmlist);
RcFile.Free;
finally
Source_Memo.Free;
Rc_Memo.Free;
end;
except
Result:=False;
Exit;
end;
Result:=True;
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;;
解决方案 »
- delphi 字体管理混乱,确切说因该是资源管理混乱,不知道说的对不对
- delphi4升级到delphi7的时候 halt语句错误问题
- _
- delphi中怎么调用DTS包,请大家帮忙
- ascii的问题
- 类似传递的算法,真心求教
- ★☆★☆★☆急急急急,不能添加本地打印机了,帮忙啊☆★☆★☆★
- 如何写带参数的视图。
- ----高分!------如何在delphi中调用.net编写的WebService
- 谁能给我一个TOutlookBar的使用例子呀,50分相送!
- 急切求助:如何使用WordView及XlView(或者是NextOffice)浏览文件并控制修改与打印功能?
- [今天奇了~~~怪了~~~]运行时改窗体居然有问题!!!!!!!11
详见http://community.csdn.net/Expert/help/usehelp.htm 3:删除贴子