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;;