怎么将其他文件做成exe文件?(200分)

  • 主题发起人 主题发起人 梁坚
  • 开始时间 开始时间

梁坚

Unregistered / Unconfirmed
GUEST, unregistred user!
想将.tex.bmp等类型的文件做成.exe文件。看过人家的软件,心中羡慕,痒痒。谁解析一下?
最好有原代码。c,delphi的都可以。给好多的分分啊
 
自己做一个能读的头文件在凭借一下,很简单的!
 
很简单就说详细一点好了
我也来看看STEP BY STEP
 
梁坚:
你是针对单个文件?
 
使用资源文件,在资源文件中提取文本或图象。
 
将.tex.bmp等类型的文件用可执行文件裹起来
 
>> 将.txt.bmp等类型的文件用可执行文件裹起来
问题是怎么裹起来 ?
 
把它们做到资源文件里读取比较简单
 
我看提问题这位老兄和我的想法一样,就是想像那些制做安装盘的程序一样,把想要的内容
都包在一个可执行文件中,执行的时候把它解开来用,就像《星际争霸》哪样,把所有的
杂七杂八的东西、资源都包在一个.exe文件中。哪位大侠有办法,我愿再加300分!
 
^_^,我来试试?
1.如果只是把一幅图作在文件中.最简单了.把显示图形的代码写好,然后把图形文件
LOATFROMFILE,写到自己程序的最后,在文件尾部把图形数据的起点标识.OK了.
比如自释放的文件等等,都可以这样做.
2.如果做个单一的安装程序,之有一个exe.文件,方法和上面差不多.只是在标识上要有
一定的格式.比如,最后两个字节是表示有多少个文件,文件信息表的偏移量.
至于文件信息表,可以包含文件在EXE中的偏移量.长度,文件名.这就够了.当然,可以是经过
压缩的数据,解压缩后savetofile 就行了 .

制作方法:要写两个程序,一个是专门在自己的EXE尾部找数据文件信息.根据约定的已知
格式,循环读出每个文件的数据,解压缩后savetofile.
一个是制作程序,上个程序做好后,本制作程序把要打包的文件读入内存stream中,
计算好长度后,把每个文件的名字,长度,偏移量,写到解压缩程序的尾部!

--->>>:Sachow 你看着给分吧! ^_^
 
要是有原代码就好了.我知道要改,但就不知道文件头怎么改.我不知道以后要到什么时候再
能上来,所以先给分再说.反正我还有几百分.谢谢大家.
 
三代坦克:你光给理论俺小菜看不懂 8(
要给可行的具体步骤,不说源代码,就是伪代码都可以。要是做成了,我以300分送给
英雄一人!现在小菜看了上面说的,只觉得一头雾水,一点解决不了问题,您也不能怪
小菜小器,是吗?
 
制作两个程序:一个主程序,一个辅程序。主程序的作用是往辅程序的尾部添加资源,
即.tex、.bmp等文件。辅程序则负责对这些资源进行处理,如显示、编辑等。以下是
它们的例程。
主程序:
procedure TForm1.FormCreate(Sender: TObject);
var
Target,str:TFilestream;
Size:Integer;
Begin
try
str:=TFileStream.Create('My.bmp',fmOpenRead or fmShareExclusive);
Target := TFilestream.create('d:/Project1.exe', fmOpenWrite or fmShareExclusive);
// d:/Project1.exe 为辅程序
Target.Seek(0,soFromEnd);
//往辅程序的尾部添加资源
Target.CopyFrom(str,0);
Size:=str.Size + Sizeof(Size);
//计算资源大小,并写入辅程序尾部
Target.WriteBuffer(Size,Sizeof(Size));
finally
Target.Free;
str.Free;
end;
end;

辅程序:
procedure TForm1.FormCreate(Sender: TObject);
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('Temp.bmp');
//显示
Image1.LoadFromFile('Temp.bmp');
Finally
str.Free;
Source.Free;
end;
end;
 
有一点小错误:Image1.LoadFromFile('Temp.bmp');应改为:
image1.Picture.LoadFromFile('Temp.bmp');
 
有一点错:
procedure TForm1.Button1Click(Sender: TObject);
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);
//取出资源并存到文件中
<font color=red> str.CopyFrom(Source,Size - SizeOf(Size)); </font>
<font color=blue> //上面这一句报错,说是'Stream read error'
//我执行的是被写入了图片的那个执行程序,对吗? </font>

str.SaveToFile('Temp.bmp');
//显示
Image1.Picture.LoadFromFile('Temp.bmp');
Finally
str.Free;
Source.Free;
end;
end;
 
Sachow:我Test了,代码正确。
上面的报错是因为主程序没有向Project1.exe加入.BMP
 
我已经往“Project1.exe”那个文件里写了一个BMP图片了,只写了一个。
写完后新文件大小=原文件大小+图片大小。
如果我一次写了多个图片(或是其它类型的文件),该怎样读出想要的那一个,而不是
第一个呢?
 
成功了!代码是没错的,先前是我自己搞错了。感谢lucker,稍后请再拿分
 
我做了一点小的改动,就是不需要文件交换过程,直接从流中读出图片,
但也有一点不足是只能处理BMP。
procedure TForm1.Button1Click(Sender: TObject);
var
Source:TFilestream;
Size:Integer;
begin
Source := TFilestream.create(Application.ExeName, fmOpenRead or fmShareDenyNone);
Source.Seek(-Sizeof(Size),soFromEnd);
//读出资源大小
Source.ReadBuffer(Size,SizeOf(Size));
//定位到资源的开始位置
Source.Seek(-Size,soFromEnd);

Image1.Picture.Bitmap.LoadFromStream(Source);
Source.Free;
end;
 

Similar threads

后退
顶部