作为资源文件嵌入就可以解决这个问题。 用记事本写一个exe.rc,里面就一句;
MYEXE EXEFILE ssl.exe
然后用brcc32编译exe.rc,生成exe.res文件 在你的单元中插入 {$R exe.res}
至于提取出来也很简单 procedure TForm1.ExtractFile; var resStream:TResourceStream; begin try resStream:=TResourceStream.Create(hinstance,PChar( 'MYEXE '),PChar( 'EXEFILE ')); resStream.SaveToFile( 'c:\e.exe '); resStream.Free; ........ except ShowMessage( '提取文件错误 '); end; end;
把Delphi程序嵌入到其他程序中
把
Delphi程序嵌入到其他程序中 作者:佚名
文章来源:
网络 点击数: 193 更新 时间:2011-4-29 16:13:15
怎样把Delphi程序嵌入到其他程序中?2007-02-21 15:17某个
bbs站上有文章:(想来作者不会介意我 装载吧!) ============================================================================== 文件合并器的制作方法 作者:王昊
从想到做文件合并器到现在已经有一个多月了,但是一直没有静下心来想它的实现方法. 昨天看数学看 烦了, 我终于忍不住扔开了书,开始着手"文件合并器"的编制.3小时后,终于有了眉目,今天又改了一下.现在 终于能够和 各位分享我的喜悦了.我愿意将我的方法写给大家,也希望各位高手不吝赐教. 先看看我们的目的:编写一个程序A,它能够将两个可执行程序B和C合并在一起,形成
一个新的可执行程序D. 要让用户执行D的时候,相当于同时运行B和C两个程序.
我的开发工具:我现在能够用VB和DELPHI中的任何一个开发这个软件.这次我用的是
DELPHI.如果你需要,也可以用VC或BCB来完成.
下面我用这三个小时中我考虑的东西为线索来讲讲主要的原理.
一. 我的疑惑.
将两个可以执行的程序合并在一起会变成什么东西?这是我的第一个疑惑.要解
决这个问题,首先要学会 如何将两个文件合并在一起.我想到了内存流(MemoryStream),它能极方便的完成这个步 骤.假设有两个可执行文件f1, f2.现在要把他们合并在一起.下面给出原代码.
var
strmSource,strmDest:TMemoryStream;
begin
//先读f1
strmSource:=TMemoryStream.Create;
strmSource.loadfromfile(f1);
//拷贝到strmdest
strmDest:=TMemoryStream.Create;
strmDest.copyfrom(strmSource,strmSource.size);
strmSource.clear;
//再读f1
strmSource.loadfromfile(f2);
//拷贝到strmdest
strmDest.seek(strmDest.size,soFromBeginning);
strmDest.copyfrom(strmSource,strmSource.size);
strmSource.free;
//这时strmDest里面便是两个文件合并后的内容了.将它保存为文件
strmDest.SaveToFile('dest.exe');
strmDest.free;
end;
我惊讶的发现,执行dest.exe就相当于执行f1!!为了确认,我将原代码中f1和f2的
读入顺序对调,得到的新的dest.exe执行竟然相当于执行f2!!(此处省略了N个感叹号).我又用同样的方法在f
1 的后面添加很多无意义的字节,得到的新的f1运行竟然很正常.现在我们知道了,将两个或者多个可执行文件 合并在 一起,得到的新文件执行时只是执行第一个文件.这是非常关键的一步.
二.如何分离? 合并没有
问题了,如何分离呢?在知道原来的两个文件的大小的情况下,这很容易 作到.假设i1和i2是原来两个文件的大小(字节).合并后的文件是"dest.exe". var strmSource,strmDest:TMemoryStream; Begin //先读dest.exe strmSource:=TMemoryStream.Create; strmSource.loadfromfile('dest.exe'); //拷贝f1到strmdest strmDest:=TMemoryStream.Create; strmDest.copyfrom(strmSource,i1); //保存f1 strmDest.SaveToFile(f1); strmDest.clear; //拷贝f2到strmdest strmSource.seek(i1,soFromBeginning); strmDest.copyfrom(strmSource,i2); strmDest.SaveToFile(f2); strmDest.free; strmS