要求:现在想把图片、文本加入到一个exe文件的后面,然后,当程序运行的时候,从自身读取出来,现实在窗体上。提问:1、是不是要在被加入的exe程序里面写入信息:加入了多少个文件,文件大小多少等信息呢?
2、offset是偏移量,如果我加入一个integer的值,应该是64位,那偏移量是多少?是sizeof(i)?求教大家,在先等待。有示例程序,另外加分。单个文件的加入和读取,我大体知道。多个文件的不会。

解决方案 »

  1.   

    要的。很简单的。多个文件和单个文件没什么区别的。
    就是你在末尾,先放一个表示文件长度的数据,再放文件,然后读完了第一个文件,判断一下是否移动到exe文件末尾了,不是就再读一个表示文件长度的数据,在根据长度读文件
      

  2.   

    你的问题就是将多个文件打包成一个文件的问题。你可以到http://down.csdn.net/html/2006-02/23/134604.html这里下载一个这方面的例子,或者在google中搜索“演示把几个文件打包成一个文件并且释放”,你可以找到一个PackTest.zip 。
      

  3.   

    我在exe的结尾加入一个文本后,写上文件大小。下面是读入txt的函数。文本可以读入,就是最后会有一个~,后来发现由于exe的最后是文件大小,我从尾部获取文本大小以后,seek函数就把流里面的指针移动了。memo载入source多了最后8个描述文件大小字节(integer是64位的)问题1:seek后,指针移动了。那source的内容是不是就是从指针到结尾呢?因为我就用了seek后,就用Memo.Lines.LoadFromStream(Source);内容好像就是从指针处到结尾。
    2、因为结尾有8个字节是描述大小的,怎么把这段去掉,读出真实的原文件内容呢?我尝试用memorystream,好像不行。function TForm1.Lb_TxtLoad(Memo: TMemo; SourceFile: string): Boolean;
    var
      Source:TFileStream;
      //Target:TMemoryStream;
      MyFileSize:integer;
      iPos:Integer;
    begin
      try
        Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
        //Target:=TMemoryStream.Create;
        try
          iPos:=Source.Seek(-sizeof(MyFileSize),soFromEnd);
          //Showmessage('当前 pos1:'+IntToStr(iPos));
          Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源
          Showmessage('资源大小:'+IntToStr(MyFileSize));
          iPos:=Source.Seek(-MyFileSize,soFromEnd);//定位到资源开始位置
          //Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));
          //Showmessage('资源开始 pos2:'+IntToStr(iPos));
          Memo.Lines.LoadFromStream(Source);
        finally
          //Target.Free;
          Source.Free;
        end;
      except
        Result:=False;
        Exit;
      end;
      Result:=True;
    end;