我需要用b程序对a程序配置,把任意一个图片文件和文本文件写到a程序里,a程序发布出去后,里面带b程序对他写如的图片文件跟文本文件。  
 
下面是b程序的配置代码:  
var  
   Target,str:TFilestream;  
   Size:Integer;  
   sr:  TSearchRec;  
Begin  
   FindFirst('d:\a.exe',  faAnyFile,  sr);  
   if  (sr.Size  div  1024)  >  500  then  
   begin  
       showmessage('已经添加好了!');  
       exit;  
   end;  
   try  
       //写如图片  
       str:=TFileStream.Create('My.bmp',fmOpenRead  or  fmShareExclusive);  
       Target  :=  TFilestream.create('d:\a.exe',  fmOpenWrite  or  fmShareExclusive);  
       Target.Seek(0,soFromEnd);  
       //往辅程序的尾部添加资源  
       Target.CopyFrom(str,0);  
       Size:=str.Size  +  Sizeof(Size);  
       //计算资源大小,并写入辅程序尾部  
       Target.WriteBuffer(Size,Sizeof(Size));  
       Target.Free;  
       str.Free;  
       //写入文字  
       str:=TFileStream.Create('1.txt',fmOpenRead  or  fmShareExclusive);  
       Target  :=  TFilestream.create('d:\a.exe',  fmOpenWrite  or  fmShareExclusive);  
       Target.Seek(0,soFromEnd);  
       //往辅程序的尾部添加资源  
       Target.CopyFrom(str,0);  
       Size:=str.Size  +  Sizeof(Size);  
       //计算资源大小,并写入辅程序尾部  
       Target.WriteBuffer(Size,Sizeof(Size));  
   finally  
       Target.Free;  
       str.Free;  
   end;  
 
上面的代码能成功的把图片文件跟文本文件写到a里。  
 
再看a的读出配置文件的代码  
var  
   Source:TFilestream;  
   str:TMemoryStream;  
   Size:Integer;  
Begin  
   try  
       str:=TMemoryStream.Create;  
       Source  :=  TFilestream.create(Application.ExeName,  fmOpenRead  or  fmShareDenyNone);  
       Source.Seek(-Sizeof(Size),soFromEnd);  
       //读出资源大小  
       Source.ReadBuffer(Size,SizeOf(Size));  
       //定位到资源的开始位置  
       Source.Seek(-Size,soFromEnd);  
       //取出资源并存到文件中  
       str.CopyFrom(Source,Size  -  SizeOf(Size));  
       str.SaveToFile('1.txt');  
       //显示  
       Memo1.Lines.LoadFromFile('1.txt');  
 
   Finally  
       str.Free;  
       Source.Free;  
   end;  
 
该段代码能成功的把  添加到尾端的文本文件读出,当是图片文件没办法读出来,有什么方法能把图片文件跟文本文件都分解出来哈,上面的代码原本是我辛苦找的,但只能添加一个文件,现在我需要加2个文件,但对流的造作不熟悉,不知道怎么改好,大虾救救俺呀,

解决方案 »

  1.   

    不会呀,对流的操作不懂。 Source.Seek(-Sizeof(Size),soFromEnd);   这个(-Sizeof(Size)是根据什么的来的我都不知道,改成0还真个不行,还不许是 -Sizeof(Size)
      

  2.   

    哦,你已经记下了图片位置;
    在你读取那一段你在继续读一遍就可以得到图片了
    var  
       Source:TFilestream;  
       str:TMemoryStream;  
       Size:Integer;  
    Begin  
       try  
           str:=TMemoryStream.Create;  
           Source  :=  TFilestream.create(Application.ExeName,  fmOpenRead  or  fmShareDenyNone);  
           Source.Seek(-Sizeof(Size),soFromEnd);  
           //读出资源大小  
           Source.ReadBuffer(Size,SizeOf(Size));  
           //定位到资源的开始位置  
           Source.Seek(-Size,soFromEnd);  
           //取出资源并存到文件中  
           str.CopyFrom(Source,Size  -  SizeOf(Size));  
           str.SaveToFile('1.txt');  
           //显示  
           Memo1.Lines.LoadFromFile('1.txt');  
     //添加以下代码是读取图片的
           Source.Seek(-Sizeof(Size),soFromCurrent);  
           Source.ReadBuffer(Size,SizeOf(Size));  
           Source.Seek(-Size,soFromCurrent);  
           str.CopyFrom(Source,Size  -  SizeOf(Size));  
           str.SaveToFile('My.bmp');  
           image1.Picture.Graphic.loadFromSteam(str);//添加一个image来显示
       Finally  
           str.Free;  
           Source.Free;  
       end;  
      

  3.   

    sizeof 是取所给参数所暂用的内存大小,其实他的参数应该是一个类型
    Sizeof(Size)这样写法其实是不规范的,不过也没关系默认会取他的类型
    实际上你应该写成sizeof(integer)
      

  4.   

    谢谢,楼上给了点思路,但是 在读取图片的时间 ,运行到str.CopyFrom(Source,Size  -  SizeOf(Size));   这一步就出错了
      

  5.   

    还是这个问题?GreenWaterBlueSky(碧水蓝天) 的回复思路也是对的,不过在读完1.txt后,Source的Position已经又移到了记载1.txt大小的位置,需要再次移到1.txt的数据开始位置
    Source.Seek(Size,soFromEnd);然后再用GreenWaterBlueSky的代码读取图片大小和数据
    >>>
    //添加以下代码是读取图片的
    Source.Seek(-Sizeof(Size),soFromCurrent);
    Source.ReadBuffer(Size,SizeOf(Size));
    Source.Seek(-Size,soFromCurrent);
    str.CopyFrom(Source,Size - SizeOf(Size));
    str.SaveToFile('My.bmp');