先将A.exe文件作成资源文件放在你的工程文件中(比如说是 b.exe), b.exe 在 打包时先将 a.exe 释放出来,然后再使用上面的代码将图片写入 a.exe 文件中。当然 a.exe 文件本身要有读出图片的能力。 不知你明白没有?你另开一贴,给我100分,我把源代码给你,OK?---------------------------------------------------贴子为你而开,来吧!!!!

解决方案 »

  1.   

    //这是 a.exe unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      fs:TFileStream;
      ms:TMemoryStream;
      buff1:boolean;
      size:int64;
      bmp:TBitmap;
    begin
      fs:=TFileStream.Create(application.ExeName,fmOpenread or fmShareDenynone);
      fs.Position:=fs.Size-sizeof(boolean);
      fs.ReadBuffer(buff1,sizeof(boolean));
      //if buff1 then    //如果加入了图片
      begin
        fs.Position:=fs.size-sizeof(boolean)-sizeof(int64);
        fs.ReadBuffer(size,sizeof(int64));    //读出图片的大小
        fs.Position:=fs.Size-sizeof(boolean)-sizeof(int64)-size;
        ms:=TmemoryStream.Create;
        ms.CopyFrom(fs,size);     //将图片存入内存流中
        {bmp:=TBitmap.Create;    bmp.Width:=800;
        bmp.Height:=600;
        bmp.LoadFromStream(ms);
        form1.Canvas.Draw(0,0,bmp);}
        ms.SaveToFile('c:\zjs.bmp');
        image1.Picture.LoadFromFile('c:\zjs.bmp');
        ms.Free;
      end;
      fs.Free;
    end;end.
      

  2.   

    //这是 b.exeunit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    {$R a.res}function zjs_getFileSize1(filename:TFilename):int64;
    var
      hFile:THandle;
    begin
      hFile:=fileOpen(filename,fmopenread or fmsharedenywrite);
      result:=fileseek(hFile,0,soFromEnd);
      fileclose(hFile);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      rs:TResourceStream;
      fs,fs1:TFileStream;
      picFile,targetFile:string;
      buff:boolean;
      size:int64;
    begin
      if opendialog1.Execute then
      begin
        if savedialog1.Execute then
        begin
          picFile:=opendialog1.FileName;
          targetFile:=savedialog1.FileName;
          rs:=TResourceStream.Create(hinstance,'a_exe','Unknown');
          rs.SaveToFile(targetFile);
          fs:=TFileStream.Create(targetFile,fmOpenWrite or fmShareDenyWrite);
          fs1:=TFileStream.Create(picFile,fmOpenRead or fmShareDenynone);
          fs1.Position:=0;
          fs.Seek(0,soFromEnd);
          fs.CopyFrom(fs1,0);
          size:=zjs_getFileSize1(picFile);
          fs.Seek(0,soFromEnd);
          fs.WriteBuffer(size,sizeof(int64));
          buff:=true;
          fs.Position:=fs.Size;
          fs.WriteBuffer(buff,sizeof(boolean));
          fs.Free;      showMessage('OK!');
        end;
      end;
    end;end.
      

  3.   

    这是 a.rc a_exe Unknown "D:\Program Files\Borland\Delphi7\Projects\a\a.exe"
      

  4.   

    to :goomoo 当要加入多副图片(不光是BMP,还有JPG)、多个声音文件,A文件要按顺序判断和读出应该怎么改??
      

  5.   

    以下是加入多幅bmp图片的代码://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.
      

  6.   

    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.
      

  7.   

    说明: 运行b.exe 文件,单击按钮选择多幅bmp图片,选择生成的exe文件名(比如 pic.exe),运行pic.exe,单击按钮,pic.exe 将插入自身的图片全部显示出来。
    本例并未将 a.exe 文件作成资源到 b.exe 文件中,所以运行 b.exe 时 a.exe 要与b.exe文件在同一目录下。对于其他格式的不能直接从内存中装载的文件,需要先存到临时文件中。
      

  8.   

    我不太明白为什么这么判断?能否解释一下?fs.Seek(-sizeof(boolean),soFromEnd);
      fs.ReadBuffer(added,sizeof(added));    //读出文件是否被加入图片
    if added then    //如果加入了
      

  9.   

    读出的缓冲可以是任何类型的。因为写入的时候也是Bool型的,所以可以读出bool型的。请看b.exe 的源程序的最后。      added:=true;
          ms_target.Seek(0,soFromEnd);
          ms_target.WriteBuffer(added,sizeof(boolean)); //写入bool值
      

  10.   

    可以支持jpg,需要在声明中加入: uses jpeg;
      

  11.   

    我改成C++ Builder代码成老出错,不知道怎么回事。哪位大虾能帮忙改成C++ Builder代码!!!!我可以送100分!!!
      

  12.   


    呵呵~ 你先把这帖子结了吧,再开一贴请人帮助转成C++ Builder的吧。很遗憾我不会 C++ Builder. 对不住了。:)