begin xcount:=0; Wnd := FindWindow('IEFrame', nil); if Wnd = 0 then begin // form1.Memo1.Lines.Add('【IE没有运行】'); exit; end; WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil); if WndChild <> 0 then begin WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil); if WndChild <> 0 then begin GetIEFromHWnd(WndChild, IE); //Get Iwebbrowser2 from Handle Document := IE.Document as IHtmlDocument2; if Assigned(Document) then begin all := Document.All; for I := 0 to all.Length - 1 do begin vk:=i; dispatch:=all.item(vk,0); if succeeded(Dispatch.QueryInterface(IHTMLObjectElement,hinput)) then begin xcount:=xcount+1; strx[xcount]:=hinput.altHtml; // showmessage(IntToStr( xcount)); // form1.memo1.Lines.Add(hinput.altHtml);//:=edit1.Text // form1.memo1.Lines.Add( '【FLASH】 '+hinput.codeBase);//:=edit1.Text form1.Edit1.Text:=hinput.BaseHref;//:=edit1.Text // form1.memo1.Lines.Add( '【FLASH】 '+hinput.data);//:=edit1.Text end; end; end; end; end; end; procedure TForm1.SpeedButton2Click(Sender: TObject); begin CheckListBox1.Clear; getIEpassword ; Timer1.Enabled:=true;end;procedure TForm1.Timer1Timer(Sender: TObject); var str:string; stari,endi,i:integer; begin if (pos('.htm',edit1.Text)<>0) or (pos('.shtml',edit1.Text)<>0) or (pos('.asp',edit1.Text)<>0) or (pos('.html',edit1.Text)<>0) or (pos('.jsp',edit1.Text)<>0) or (pos('.aspx',edit1.Text)<>0) then begin edit2.Text:= StrrScan(pchar(edit1.text),'/') ; edit2.Text:=IntToStr( ansipos(edit2.text,edit1.Text ) ); edit2.Text:=LeftStr(edit1.Text,StrToInt(edit2.Text)); end else edit2.Text:=edit1.Text; label1.caption:=edit2.Text; for i:=1 to xcount do begin str:=UpperCase( trimright( strx[i])); stari:= pos('"',str); endi:= Pos('.SWF',str); edit3.Text:=MidStr(str,stari+1,endi+3-stari) ; IF POS('/',EDIT3.Text)=1 THEN EDIT3.Text:=MidStr(EDIT3.Text,2,LENGTH(EDIT3.Text)-1); // ShowMessage(edit3.Text); if ansipos('http:',edit3.Text)=0 then edit2.text:=label1.Caption+edit3.text else edit2.text:=edit3.text; // ShowMessage(edit2.Text); if pos('.SWF',edit2.Text)<>0 then CheckListBox1.Items.Add(edit2.Text); end; Timer1.Enabled:=false; end; function GetURLFileName(aURL: string): string; var i: integer; s: string; begin //返回下载地址的文件名 s := aURL; i := Pos('/', s); while i <> 0 do //去掉"/"前面的内容剩下的就是文件名了 begin Delete(s, 1, i); i := Pos('/', s); end; Result := s; end; function GetProt(aURL: string): Byte; begin //检测下载的地址是http还是ftp Result := 0; if Pos('http', LowerCase(aURL)) = 1 then Result := 1; //http协议 if Pos('ftp', LowerCase(aURL)) = 1 then Result := 2; //ftp协议 end; procedure HttpDownLoad(aURL, aFile: string; bResume: Boolean); var tStream: TFileStream; begin //Http方式下载 if FileExists(aFile) then //如果文件已经存在 tStream := TFileStream.Create(aFile, fmOpenWrite) else tStream := TFileStream.Create(aFile, fmCreate); if bResume then //续传方式 begin form1.IdHTTP1.Request.ContentRangeStart := tStream.Size - 1; tStream.Position := tStream.Size - 1; //移动到最后继续下载 form1.IdHTTP1.Head(aURL); form1.IdHTTP1.Request.ContentRangeEnd := form1.IdHTTP1.Response.ContentLength; end else //覆盖或新建方式 begin form1.IdHTTP1.Request.ContentRangeStart := 0; end; try form1.IdHTTP1.Get(aURL, tStream); //开始下载 finally tStream.Free; end; end;procedure MyDownLoad(aURL, aFile: string; bResume: Boolean); begin case GetProt(aURL) of 0: ShowMessage('不可识别的地址!'); 1: HttpDownLoad(aURL, aFile, bResume); end; end; procedure TForm1.CheckListBox1DblClick(Sender: TObject); var aURL, aFile: string; begin CheckListBox1.Checked[CheckListBox1.ItemIndex]:=TRUE; aURL := CheckListBox1.Items[CheckListBox1.Itemindex]; //下载地址,例如"http://www.2ccc.com/update/demo.exe" aFile := GetURLFileName(aURL); //得到文件名,例如"demo.exe" if FileExists(aFile) then begin case MessageDlg('文件已经存在,是否续传?', mtConfirmation, mbYesNoCancel, 0) of mrYes: MyDownLoad(aURL, aFile, True); //续传 mrNo: MyDownLoad(aURL, aFile, False); //覆盖 mrCancel: Exit; //取消 end; end else MyDownLoad(aURL, aFile, False); //建立新文件下载 end;procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin if AbortTransfer then begin //中断下载 IdHTTP1.Disconnect; IdFTP1.Abort; end; ProgressBar1.Position := AWorkCount; Application.ProcessMessages; end;procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin AbortTransfer := False; if AWorkCountMax > 0 then ProgressBar1.Max := AWorkCountMax else ProgressBar1.Max := BytesToTransfer; end;procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin ProgressBar1.Position := 0; end;
xcount:=0;
Wnd := FindWindow('IEFrame', nil);
if Wnd = 0 then
begin
// form1.Memo1.Lines.Add('【IE没有运行】');
exit;
end;
WndChild := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil);
if WndChild <> 0 then
begin
WndChild := FindWindowEX(WndChild, 0, 'Internet Explorer_Server', nil);
if WndChild <> 0 then
begin
GetIEFromHWnd(WndChild, IE); //Get Iwebbrowser2 from Handle
Document := IE.Document as IHtmlDocument2;
if Assigned(Document) then
begin
all := Document.All;
for I := 0 to all.Length - 1 do
begin
vk:=i;
dispatch:=all.item(vk,0);
if succeeded(Dispatch.QueryInterface(IHTMLObjectElement,hinput)) then
begin
xcount:=xcount+1;
strx[xcount]:=hinput.altHtml;
// showmessage(IntToStr( xcount));
// form1.memo1.Lines.Add(hinput.altHtml);//:=edit1.Text
// form1.memo1.Lines.Add( '【FLASH】 '+hinput.codeBase);//:=edit1.Text
form1.Edit1.Text:=hinput.BaseHref;//:=edit1.Text
// form1.memo1.Lines.Add( '【FLASH】 '+hinput.data);//:=edit1.Text
end;
end;
end;
end;
end;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
CheckListBox1.Clear;
getIEpassword ;
Timer1.Enabled:=true;end;procedure TForm1.Timer1Timer(Sender: TObject);
var
str:string;
stari,endi,i:integer;
begin
if (pos('.htm',edit1.Text)<>0) or (pos('.shtml',edit1.Text)<>0) or (pos('.asp',edit1.Text)<>0) or (pos('.html',edit1.Text)<>0) or (pos('.jsp',edit1.Text)<>0) or (pos('.aspx',edit1.Text)<>0) then
begin
edit2.Text:= StrrScan(pchar(edit1.text),'/') ;
edit2.Text:=IntToStr( ansipos(edit2.text,edit1.Text ) );
edit2.Text:=LeftStr(edit1.Text,StrToInt(edit2.Text));
end else edit2.Text:=edit1.Text;
label1.caption:=edit2.Text;
for i:=1 to xcount do
begin
str:=UpperCase( trimright( strx[i]));
stari:= pos('"',str);
endi:= Pos('.SWF',str);
edit3.Text:=MidStr(str,stari+1,endi+3-stari) ;
IF POS('/',EDIT3.Text)=1 THEN EDIT3.Text:=MidStr(EDIT3.Text,2,LENGTH(EDIT3.Text)-1);
// ShowMessage(edit3.Text);
if ansipos('http:',edit3.Text)=0 then
edit2.text:=label1.Caption+edit3.text
else edit2.text:=edit3.text;
// ShowMessage(edit2.Text);
if pos('.SWF',edit2.Text)<>0 then
CheckListBox1.Items.Add(edit2.Text);
end;
Timer1.Enabled:=false;
end;
function GetURLFileName(aURL: string): string;
var
i: integer;
s: string;
begin //返回下载地址的文件名
s := aURL;
i := Pos('/', s);
while i <> 0 do //去掉"/"前面的内容剩下的就是文件名了
begin
Delete(s, 1, i);
i := Pos('/', s);
end;
Result := s;
end;
function GetProt(aURL: string): Byte;
begin //检测下载的地址是http还是ftp
Result := 0;
if Pos('http', LowerCase(aURL)) = 1 then
Result := 1; //http协议
if Pos('ftp', LowerCase(aURL)) = 1 then
Result := 2; //ftp协议
end;
procedure HttpDownLoad(aURL, aFile: string; bResume: Boolean);
var
tStream: TFileStream;
begin //Http方式下载
if FileExists(aFile) then //如果文件已经存在
tStream := TFileStream.Create(aFile, fmOpenWrite) else
tStream := TFileStream.Create(aFile, fmCreate);
if bResume then //续传方式
begin
form1.IdHTTP1.Request.ContentRangeStart := tStream.Size - 1;
tStream.Position := tStream.Size - 1; //移动到最后继续下载
form1.IdHTTP1.Head(aURL);
form1.IdHTTP1.Request.ContentRangeEnd := form1.IdHTTP1.Response.ContentLength;
end else //覆盖或新建方式
begin
form1.IdHTTP1.Request.ContentRangeStart := 0;
end;
try
form1.IdHTTP1.Get(aURL, tStream); //开始下载
finally
tStream.Free;
end;
end;procedure MyDownLoad(aURL, aFile: string; bResume: Boolean);
begin
case GetProt(aURL) of
0: ShowMessage('不可识别的地址!');
1: HttpDownLoad(aURL, aFile, bResume);
end;
end;
procedure TForm1.CheckListBox1DblClick(Sender: TObject);
var
aURL, aFile: string;
begin
CheckListBox1.Checked[CheckListBox1.ItemIndex]:=TRUE; aURL := CheckListBox1.Items[CheckListBox1.Itemindex]; //下载地址,例如"http://www.2ccc.com/update/demo.exe"
aFile := GetURLFileName(aURL); //得到文件名,例如"demo.exe"
if FileExists(aFile) then
begin
case MessageDlg('文件已经存在,是否续传?', mtConfirmation, mbYesNoCancel, 0) of
mrYes: MyDownLoad(aURL, aFile, True); //续传
mrNo: MyDownLoad(aURL, aFile, False); //覆盖
mrCancel: Exit; //取消
end;
end else MyDownLoad(aURL, aFile, False); //建立新文件下载
end;procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
if AbortTransfer then
begin //中断下载
IdHTTP1.Disconnect;
IdFTP1.Abort;
end;
ProgressBar1.Position := AWorkCount;
Application.ProcessMessages;
end;procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
AbortTransfer := False;
if AWorkCountMax > 0 then
ProgressBar1.Max := AWorkCountMax else
ProgressBar1.Max := BytesToTransfer;
end;procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position := 0;
end;
感觉你的路子有点不对,
这个东西我做过,
用webbrowser控件
其实很简单,用dom接口处理,
你前面的差不多,
都是首先 WeBbrowser1.Navigate(url);
然后doc:=WebBrowser1.Document as IHTMLDocument2;
a:=doc.all;
e:=a.item(i, 0) as IHTMLElement;
接着分析doc的元素,
目前页面中的flash有好几种形式,
分别处理,有的是直接取出object,有的要做语法分析,
还有类似http://xx.yyy.zzz/check.php?m=xxxx这种带参数从库中直接调用的,
至于要处理多少种情况,就要自己多测试各种站点了,
判断各种flash这块是个重点,
但我在你程序中没看出来都怎么处理了
找到后处理下头尾得到文件名,
一句话UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil)
就下载了,不用自己弄一大堆下载的代码,
记的UrlDownloadToFile要use urlmon
做这种东西,MSDN要多看,看懂了就做的快了,
ie很多接口拿来就用,功能很强,不用自己做,
另外注意各个ie版本支持的功能差很多,
特别是ie6和以前版本很多功能不兼容了