求助:获取IE框架!如果IE框架的连接是完整的地址,就会出错,怎么办? ( 积分: 100 )

  • 主题发起人 主题发起人 yyst
  • 开始时间 开始时间
Y

yyst

Unregistered / Unconfirmed
GUEST, unregistred user!
var IE1: IWebBrowser2;
IDoc1: IHTMLDocument2;
iELC: IHTMLElementCollection;
HtmlWindow: IHTMLWindow2;
begin
………… (部分省略)
IE1.Document.QueryInterface(IHTMLDocument2, IDoc1);
if IDoc1 <> nil then
begin
if IDoc1.frames.length > 0 then
begin
for j := 0 to IDoc1.frames.length - 1 do
begin
spDisp :=IDoc1.frames.item(j);
if Succeeded(spDisp.QueryInterface(IHTMLWindow2, HtmlWindow)) then
begin
if HtmlWindow <> nil then
begin
(从这开始出错)
iELC := HtmlWindow.Document.all;
ShowMessage(HtmlWindow.document.url );
//执行到以上部分,如果框架的URL地址是完整地址(http:/ /...)的话,就会出错,提示EoleException错误,拒绝访问。怎么会事?如果是相对地址,就不会出错
……
end;
end;
…………
 
var IE1: IWebBrowser2;
IDoc1: IHTMLDocument2;
iELC: IHTMLElementCollection;
HtmlWindow: IHTMLWindow2;
begin
………… (部分省略)
IE1.Document.QueryInterface(IHTMLDocument2, IDoc1);
if IDoc1 <> nil then
begin
if IDoc1.frames.length > 0 then
begin
for j := 0 to IDoc1.frames.length - 1 do
begin
spDisp :=IDoc1.frames.item(j);
if Succeeded(spDisp.QueryInterface(IHTMLWindow2, HtmlWindow)) then
begin
if HtmlWindow <> nil then
begin
(从这开始出错)
iELC := HtmlWindow.Document.all;
ShowMessage(HtmlWindow.document.url );
//执行到以上部分,如果框架的URL地址是完整地址(http:/ /...)的话,就会出错,提示EoleException错误,拒绝访问。怎么会事?如果是相对地址,就不会出错
……
end;
end;
…………
 
顶上去,请高手解惑!
 
顶上去,请高手解惑!
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw,MSHTML;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
IE1: IWebBrowser2;
IDoc1: IHTMLDocument2;
iELC: IHTMLElementCollection;
HtmlWindow: IHTMLWindow2;
j:integer;
spDisp:OleVariant;
begin

IE1.Document.QueryInterface(IHTMLDocument2, IDoc1);
if IDoc1 <> nil then
begin
if IDoc1.frames.length > 0 then
begin
for j := 0 to IDoc1.frames.length - 1 do
begin
spDisp :=IDoc1.frames.item(j);//编译通不过
if Succeeded(spDisp.QueryInterface(IHTMLWindow2, HtmlWindow) ) then //这也通不过
begin
if HtmlWindow <> nil then
begin
iELC := HtmlWindow.Document.all;
ShowMessage(HtmlWindow.document.url );
//执行到以上部分,如果框架的URL地址是完整地址(http:/ /...)的话,就会出错,提示EoleException错误,拒绝访问。怎么会事?如果是相对地址,就不会出错
end;
end;
end.
 
可能是框架套框架的缘故。偶很早前也写过读框架内容的程序,记的读的那个框架套了四层,要一层一层的进。你的可能就是框架里面还有框架。
 
TO sky1001
谢谢你的关注,这不是框架套框架的缘故,而是如果要处理的那个网页中的框架引用的连接地址是相对地址,就不会出错,如果是绝对地址就会错!(不信你进入http://movie.online.cq.cn/ 这个网页,有三个框架,第一个和第三个是相对地址,第二个是绝对地址,程序执行到处理第二个框架的是后出错!)

原执行模块是这样的,执行到标识处就会提示错误。
procedure TForm1.btn1Click(Sender: TObject);
var ShellWindow: IShellWindows;
nCount: integer;
spDisp: IDispatch;
i, j, k: integer;
vi: OleVariant;
IE1: IWebBrowser2;
IDoc1: IHTMLDocument2;
iELC: IHTMLElementCollection;
HtmlWindow: IHTMLWindow2;
HtmlInputEle: IHTMLInputElement;
begin
ShellWindow := CoShellWindows.Create;
nCount := ShellWindow.Count;

for i := 0 to nCount - 1 do
begin
vi := i;
spDisp := ShellWindow.Item(vi);
spDisp.QueryInterface(IWebBrowser, IE1);
if IE1 <> nil then
begin
IE1.Document.QueryInterface(IHTMLDocument2, IDoc1);
if IDoc1 <> nil then
begin
mmo1.Lines.Add(IDoc1.title);
mmo1.Lines.Add(IDoc1.url);
mmo1.Lines.Add(IntToStr(IDoc1.frames.length));
mmo1.Lines.Add(IntToStr(IDoc1.all.length));
mmo1.Lines.Add('-------------');
mmo1.Lines.Add('');

iELC := IDoc1.all;
// PutData(iELC, 'yyst', '11111111');

if IDoc1.frames.length > 0 then
begin
for j := 0 to IDoc1.frames.length - 1 do
begin
vi := j;
spDisp :=IDoc1.frames.item(vi);

if Succeeded(spDisp.QueryInterface(IHTMLWindow2, HtmlWindow)) then
begin
if HtmlWindow <> nil then
begin
////////[:(]从此处开始
iELC := HtmlWindow.Document.all;
ShowMessage(HtmlWindow.document.url );
///////[:(]到此处结束
end;
end;
end;
end;
end;
end;
end;
end;
 
那个网址需要用户名和密码.
 
TO SKY1001

这样 我给你一个网页供你测试,你就知道!http://yyst.ik8.com/index.htm

经过测试 如果网页的URL和框架的URL不同,就会出错,提示 “不能访问”!!!

测试到第三个框架会出错。
 
跨域访问,因为安全的原因被拒绝了.

这个是IE安全机制决定的.无解.
 
to satanmonkey : 为什么有的自动填表软件比如AI RoboForm就可以实现类试的跨域访问???这是怎么实现的?是不是只有弄成个IE插件的形式才能实现?
 
他们怎么实现的我不清楚,不过我知道bho也受到这个限制.可能的办法是,在每个域里都有他们的实例,然后通过其他办法共享数据.

你不能用一个域里的实例去访问另外一个域的数据,限制在这里.不过你可以每个域都有自己的实例.然后通过自己的共享机制来恭喜数据.
 
拜托能不能给个可以访问的网页!
你给的第二个网页正在扩容,不能访问!!!!!!!!!!!!!1
 
to satanmonkey : 你说的"不过你可以每个域都有自己的实例.然后通过自己的共享机制来恭喜数据." 怎样判断是否框架是否在一个域中?如何创建那样不同的实例?
 
这个问题我也不知道怎么解决.以前我也碰到过.一直没解决.
 
TO satanmonkey : 谢谢你 我再顶一下!
 
to sky1001 : 不好意思 昨天才申请的 今天就不行了

http://www.real2000.org/ 有两个框架,访问到第二个会出错!怎么办?
 
顶上去,请高手解惑
 
......................
 
还是无人解答啊

积分分了算了
 
后退
顶部