delphi程序的调用

上传人:鲁** 文档编号:511962844 上传时间:2023-05-21 格式:DOC 页数:19 大小:62.50KB
返回 下载 相关 举报
delphi程序的调用_第1页
第1页 / 共19页
delphi程序的调用_第2页
第2页 / 共19页
delphi程序的调用_第3页
第3页 / 共19页
delphi程序的调用_第4页
第4页 / 共19页
delphi程序的调用_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《delphi程序的调用》由会员分享,可在线阅读,更多相关《delphi程序的调用(19页珍藏版)》请在金锄头文库上搜索。

1、作为资源文件嵌入就可以解决这个问题。 用记事本写一个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

2、 ); resStream.Free; . except ShowMessage( 提取文件错误 ); end; end; 把Delphi程序嵌入到其他程序中把Delphi程序嵌入到其他程序中作者:佚名 文章来源:网络 点击数: 193 更新 时间:2011-4-29 16:13:15 怎样把Delphi程序嵌入到其他程序中?2007-02-21 15:17某个bbs站上有文章:(想来作者不会介意我装载吧!)= 文件合并器的制作方法 作者:王昊 从想到做文件合并器到现在已经有一个多月了,但是一直没有静下心来想它的实现方法. 昨天看数学看烦了, 我终于忍不住扔开了书,开始着手文件合并器的编制.3

3、小时后,终于有了眉目,今天又改了一下.现在终于能够和 各位分享我的喜悦了.我愿意将我的方法写给大家,也希望各位高手不吝赐教. 先看看我们的目的:编写一个程序A,它能够将两个可执行程序B和C合并在一起,形成 一个新的可执行程序D. 要让用户执行D的时候,相当于同时运行B和C两个程序. 我的开发工具:我现在能够用VB和DELPHI中的任何一个开发这个软件.这次我用的是 DELPHI.如果你需要,也可以用VC或BCB来完成. 下面我用这三个小时中我考虑的东西为线索来讲讲主要的原理. 一. 我的疑惑. 将两个可以执行的程序合并在一起会变成什么东西?这是我的第一个疑惑.要解 决这个问题,首先要学会 如何

4、将两个文件合并在一起.我想到了内存流(MemoryStream),它能极方便的完成这个步 骤.假设有两个可执行文件f1, f2.现在要把他们合并在一起.下面给出原代码. var strmSource,strmDest:TMemoryStream; begin /先读f1 strmSource:=TMemoryStream.Create; strmSource.loadfromfile(f1); /拷贝到strmdest strmDest:=TMemoryStream.Create; strmDest.copyfrom(strmSource,strmSource.size); strmSourc

5、e.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的 读入顺

6、序对调,得到的新的dest.exe执行竟然相当于执行f2!(此处省略了N个感叹号).我又用同样的方法在f1 的后面添加很多无意义的字节,得到的新的f1运行竟然很正常.现在我们知道了,将两个或者多个可执行文件合并在 一起,得到的新文件执行时只是执行第一个文件.这是非常关键的一步. 二.如何分离? 合并没有问题了,如何分离呢?在知道原来的两个文件的大小的情况下,这很容易 作到.假设i1和i2是原来两个文件的大小(字节).合并后的文件是dest.exe. var strmSource,strmDest:TMemoryStream; Begin /先读dest.exe strmSource:=TMem

7、oryStream.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

8、.free; strmSource.free; end; 三.总体思路. 在解决了上述问题后,我的总体思路就出来了.假设我给用户的程序是A,它能把 B和C合并起来得到D.那么D具有什么特征呢?D应该至少由三个部分组成(请注意是至少):第一部分是一个可 执行的程序,我把它叫做 标准程序S,他能将D的第二部分和第三部分(就是原来的可执行文件B和C)读出来,保存在磁盘上,然后执行他们.但大家看了如何分离后应该知道,只有我们知道了B和C的长度时,才能方便的从D中读出他们.而为了使D可以在另一个用户的机子上也能够运行,我认为B和C的长度信息应该保存在D的最后.于是,D应该具有四个部分: 1: S 2:

9、B 3: C 4: 长度信息 那么,既然我给用户的程序是A,那么这里的标准程序又从何而来呢?标准程序又应该保存在哪里呢? 有两个办法.第一,给用户的程序包含两个文件,一个是A,一个是S.但我觉得这样不够 爽.于是我用了另一个方法: 将S连在A的后面,成为A. 于是乎,当用户执行A时,A要求用户选择两个可执行文件B和C.当用户点击确定时, A将它自身所带的S与B和C合并起来,形成D.然后,用户便可以执行D了,这时的D并不依赖于A.D执行时,实际上执行的是它的第一部分S,S首先从D的最后取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目 录.然后调用ShellExecute执行他们

10、.这样就达到了我们的目的. 那么,长度信息如何定义呢?如何将S连在A的后面呢?S如何完成自身的功能呢?这就是 我下面要讲的. 四.保存长度信息. 我先讲一讲如何把一个字符串写入内存流.其实我自己也不知道如何直接将一个 字符串的内容读到内存流中,于是我采取了先将字符串内容写入一个临时文件中,然后用loadformfile将文件内容读入内存流中. 然而,我们必须知道连接在D后面的长度信息的具体长度,也就是说用几个字节保 存,才能让S读出长度信息.我考虑再三,决定用32个字节来表示每个文件的长度,虽然大多数情况下,文件大小不会超出100M. 看看这里的代码: var strmSource,strmD

11、est:TMemoryStream; s1,s2:string; f:TextFile; begin /先用上面的方法将S和B与C的内容写入strmdest,现在要在strmDest里面添 加长度信息 /假设s1,s2里放有B和C的大小,先把他们变为32个字节. while length(s1)32 do begin s1:=0+s1; end; while length(s2)32 do begin s2:=0+s1; end; /s1存入文件 assignfile(f,tmp); rewrite(f); try write(f,s1); finally closefile(f); end; /文件内容读入strmSource strmSource:=TMemoryStream.Create; strmSource.loadfromfile(tmp); /加到strmDest后面 strmDest.copyfrom(strmSource,strmSource.size); strmSource.clear; deletefile(tmp); /s2存入文件 assignfile(f,tmp); rewrite(f); try write(f,s2); fi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号