首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

哭呀,搞不懂,写exe文件配置器的有关问题,高手来哈

2012-02-05 
哭呀,搞不懂,写exe文件配置器的问题,高手来哈。我需要用b程序对a程序配置,把任意一个图片文件和文本文件写

哭呀,搞不懂,写exe文件配置器的问题,高手来哈。
我需要用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个文件,但对流的造作不熟悉,不知道怎么改好,大虾救救俺呀,

[解决办法]
哦,你已经记下了图片位置;
在你读取那一段你在继续读一遍就可以得到图片了
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;

[解决办法]
还是这个问题?

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

热点排行