//a.exe 文件unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}const
  bmp_width=64;procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
  size:integer;
  fs:TFileStream;
  ms,ms1:TMemoryStream;
  added:boolean;
  sl:TStringlist;
  image:TImage;
  bmp:TBitmap;
begin
  added:=false;  fs:=TFileStream.Create(application.ExeName,fmOpenRead or fmShareDenyNone);
  fs.Seek(-sizeof(boolean),soFromEnd);
  fs.ReadBuffer(added,sizeof(added));    //读出文件是否被加入图片  if added then    //如果加入了
  begin
    //showMessage('Pictures added!');
    fs.Seek(-sizeof(boolean)-sizeof(integer),soFromEnd);
    fs.ReadBuffer(size,sizeof(size));
    //showMessage('stringListSize:'+intToStr(size));
    fs.Seek(-sizeof(boolean)-sizeof(integer)-size,soFromEnd);
    ms:=TmemoryStream.Create;
    ms.CopyFrom(fs,size);
    ms.SaveToFile('c:\zjs.txt');
    sl:=TStringList.Create;
    sl.LoadFromFile('c:\zjs.txt');    bmp:=TBitmap.Create;
    bmp.Width:=bmp_width;
    bmp.Height:=bmp_width;
    i:=0; j:=0;
    //showMessage('StingListCount:'+intToStr(sl.Count));
    ms1:=TMemoryStream.Create;    while i<sl.Count-1 do
    begin
      //showMessage('the '+ intTosTr(j)+' files!');
      ms1.Clear;
      ms1.Position:=0;
      fs.Seek(strToInt(sl.Strings[i]),soFromBeginning);
      ms1.CopyFrom(fs,StrToInt(sl.Strings[i+1]));
      ms1.Position:=0;
      bmp.LoadFromStream(ms1);      image:=TImage.Create(self);
      image.Parent:=self;
      image.Width:=bmp_width;
      image.Height:=bmp_width;
      image.Left:=j*bmp_width+10*j;
      form1.Width:=image.Left+image.Width+10;
      image.Canvas.Draw(0,0,bmp);      inc(i,2);
      inc(j,1);    end;    bmp.Free;    ms1.Free;
    ms.Free;
    fs.Free;
    sl.Free;
  end;end;end.//b.exe文件
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  sl_pos_size:TStringList;
  targetFile:String;
  fs:TFileStream;
  ms,ms_target:TMemoryStream;
  i:integer;
  size:integer;
  added:boolean;
begin
  if not fileExists('a.exe') then
  begin
    showMessage('File not exists: a.exe!');
    exit;
  end;
  if opendialog1.Execute then
  begin
    if saveDialog1.Execute then
    begin
      targetFile:=saveDialog1.FileName;
      ms_target:=TMemoryStream.Create;
      fs:=TFileStream.Create(extractFilePath(application.ExeName)+'a.exe',fmopenread or fmShareDenyWrite);
      fs.Position:=0;
      ms_target.CopyFrom(fs,0);
      fs.Free;      sl_pos_size:=TSTringlist.Create;
      for i:=0 to opendialog1.Files.Count-1 do      //逐个加入文件
      begin
        ms_target.Seek(0,soFromEnd);
        sl_pos_size.Add(intToStr(ms_target.Position));    //加入文件的位置
        fs:=TFileStream.Create(opendialog1.Files.Strings[i],fmOpenRead or fmShareDenynone);
        sl_pos_size.Add(intToStr(fs.Size));               //加入文件的大小
        ms_target.CopyFrom(fs,0);
        fs.Free;
      end;
      ms:=TmemoryStream.Create;
      sl_pos_size.SaveToStream(ms);
      ms.Position:=0;
      ms_target.Seek(0,soFromEnd);
      ms_target.CopyFrom(ms,0);      {size:=0;
      for i:=0 to sl_pos_size.Count-1 do
      begin
        size:=size+length(sl_pos_size.Strings[i]);
      end;}      size:=ms.Size;
      showMessage(intToStr(size));      ms_target.Seek(0,soFromEnd);
      ms_target.WriteBuffer(size,sizeof(size));      added:=true;
      ms_target.Seek(0,soFromEnd);
      ms_target.WriteBuffer(added,sizeof(boolean));
      ms_target.SaveToFile(targetFile);
      ms_target.Free;
      ms.Free;      showMessage('OK');
    end;
  end;
end;end.

解决方案 »

  1.   

    两段代码都不难,你自己把“'“改成”"“,”.“改成”->“,再将”begin“、”end“改成
    ”{“、”}“,就基本上没什么问题了。
    Integer => int
    Boolean => bool
      

  2.   

    这些基本的我知道,但改了后出错。好像这一段出错
       ms_target.Seek(0,soFromEnd);
          ms_target.WriteBuffer(size,sizeof(size));      added:=true;
          ms_target.Seek(0,soFromEnd);
          ms_target.WriteBuffer(added,sizeof(boolean));
          ms_target.SaveToFile(targetFile);
      

  3.   

    我这样改的
       ms_target->Seek(0,soFromEnd);
          ms_target->WriteBuffer((void *)size,sizeof(size));      added=true;
          ms_target->Seek(0,soFromEnd);
          ms_target->WriteBuffer((void *)added,sizeof(added));
          ms_target->SaveToFile(targetFile);
      

  4.   

    //try
          ms_target->Seek(0,soFromEnd);
          ms_target->WriteBuffer(&size,sizeof(size));      added=true;
          ms_target->Seek(0,soFromEnd);
          ms_target->WriteBuffer(&added,sizeof(added));
          ms_target->SaveToFile(targetFile);