动态生成EXE(50分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
如何动态生成EXE?
比如
TXT TO EXE
BMP TO EXE
更复杂一点
ZIP TO EXE
过分一点
SCRIPT TO EXE
??
 
我自己写过一个text to exe的,用的是turbo pascal 7.0,简单的告诉你个原理,以你的水平应该不需要源程序的:
写两个程序:
程序一:一个显示文本的程序段,具体显示方法随意,其特殊处在于所读取的文本是从本身的特定字节开始的,该特定字节为该程序编译后长度。你可以先随意定一个数字,然后编译一下,看看长度,然后将前面的数字修改后,重新编译一下,字节数是一般不变的。
程序二:可以简单的将前一个程序(exe)和指定文本连接在一起。至于是将前个程序的exe整个放在本程序内部,还是作为一个外部文件放着就随你了。
另外,CJ,你的光盘刻好了没有?
 
好了,MAIL收到了吗?
可否把那个程序MAIL我?
在DOS下,我知道该怎么做,
WIN没有思路,我还没有开始做;(
实际上我只想有思路,并不管TXT的事
 
瞎讲:
做一个通用的exe.
该exe要实现的功能如下:
运行时读取exe文件头取得exe本身长度,假设为len, 然后读取整个exe文件长度, 假设
为len1. 然后从exe文件的len+1位置读取len1-len长度字节到内存中, 这部分就是你
要处理的文本or bmp or script. 然后处理之.
现在你要做的就是把编译好的exe和你要处理的txt or bmp or script 合并到一起(用copy命令最简单)
 
1。生成一个能显示TXT,BMP,解压ZIP,解释SCRIPT的程序。
其中Text,Bmp,Zip,Script应从自身的某个偏移量(暂时不填)开始到文件尾读入。
2. 记下程序的字节数。返回程序,把程序字节数填入偏移量。
3。重编译程序,两次字节数应该一样。
4。另生成一个程序,它的功能是把上一个程序和Text,Bmp,Zip,Script
相加,并起名为Exe文件。
 
哇靠,我敲字的速度太慢了!
 
哇靠,我敲字的速度太慢了!
 
其实就是把数据文件放在Exe的最后!
 
哈哈哈,Delphi fan2的话一语道破天机!
 
一群想白赚分的人,
 
Window下的例子:
1。创建文件1:
procedure TForm1.FormCreate(Sender: TObject);
var Stream1:TFileStream;
Buff:Array[1..65536] of char;
Size,Offset,I:Integer;
begin
Offset:=189440;//文件的长度
Stream1:=TFileStream.Create(Application.ExeName,fmShareDenyWrite);//共享读打开
Size := Stream1.Size;
Stream1.Seek(Offset,soFrombegin
ning);
Stream1.Read(Buff,Size-OffSet);//读入到Buff中
Stream1.Free;
Memo1.Text:='';
for i:=1 to (Size-Offset)do
Memo1.Text:=Memo1.Text+Buff;
end;
2。创建文件2,连接文件1与文本。
procedure TForm1.Button1Click(Sender: TObject);
var Stream1:TMemoryStream;
Buff:Array[1..65536] of char;
I,Size:Integer;
begin
Stream1:=TMemoryStream.Create;
Stream1.LoadFromFile('Linkprj1.exe');//读入文件1
Size:=Stream1.Size;
Stream1.SetSize(Stream1.Size+Memo1.GetTextLen);//长度为两者相加。
Stream1.Seek(Size,soFrombegin
ning);
for i:=1 to Memo1.GetTextLendo
Buff:=Memo1.Text;
Stream1.Write(Buff,Memo1.GetTextLen);
Stream1.SaveToFile('link.exe');//写入文件
Stream1.Free;
end;
 
你用dos的copy /b a.exe+b.gif at.exe就明白了!
 
TO scy_fjqz:老兄有什么好注意?
TO CJ-SELF:COPY不行,如果有多个文件连接,需要写一个文件头,需要写程序连接.
可以加分吗?
TO 沉疴:谢谢,我试试
如何获得自己程序的长度?不要告诉我编译以后自己算!
在DOS下我直接在运行时读,现在可以吗?
 
Stream1:=TFileStream.Create(Application.ExeName,fmShareDenyRead);//共享读打开
Size := Stream1.Size;
以上不是有了吗?
 
着是连接后的,我要连接前的,即出数据文件以外的部分,
 
从文件头得出,我正要请教Another_eyes呢?
 
还可以把两个文件合成一个文件,文件1加在文件2的屁股上.
 
抱歉, 我只知道dos下的exe文件头(我原来做过个dos下的.com型的exe TSR程序),
windows的exe文件头结构不知道艾。
 
抱歉, 我只知道dos下的exe文件头(我原来做过个dos下的.com型的exe TSR程序),
windows的exe文件头结构不知道艾。
 
eYes一定和我一样做过V...:-)
不过我想知道合并前文件的长度,即EYES说的LEN,而非LEN1
如果有例子最好,虽然50但是也不错了;)
 
后退
顶部