如何使用 activex 从 ie 中正确获取 url?
how to properly grab a url from ie with activex?
我正在尝试抓取 url 页面 运行 我的 activex ,我使用了 DDEMAN
单元,但它似乎在 activex 中不起作用,这是我所做的
function Get_URL(Servicio: string): String;
var
Cliente_DDE: TDDEClientConv;
S: String;
begin
Result := '';
Cliente_DDE := TDDEClientConv.Create(nil);
with Cliente_DDE do
begin
SetLink(Servicio, 'WWW_GetWindowInfo');
S := RequestData('0xFFFFFFFF');
Result := S;
form1.memo1.Lines.Add(Result);
CloseLink;
end;
Cliente_DDE.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
URI: TIdURI;
LinK : String;
Temp: string;
Host,sExt: String;
Path : string;
begin
Link := Get_URL('Iexplore');
Temp := Copy(Link, 1, Pos(',', Link) - 1);
Temp := StringReplace(Temp, '"', '', [rfReplaceAll]);
URI := TIdURI.Create(Temp);
try
Host := URI.Host;
Path := URI.Path;
Host := StringReplace(Host ,'www.', '',[rfReplaceAll,rfIgnoreCase]);
sExt := ExtractFileExt(Host);
Host := Copy(Host, 1, Length(Host) - Length(sExt));
finally
URI.Free;
end;
end;
在 运行 之后,代码似乎 GET_URL 函数 return 空结果 ActiveX
。我在 exe 上测试了这段代码,它工作正常。可能是什么问题呢 ?如何使用 ActiveX 在 IE 中正确地获得 URL 而 运行 ?
按照雷米的建议我试过了
procedure Tactiveform.Button1Click(Sender: TObject);
var
punk: IUnknown;
poo: IOleObject;
pcs: IOleClientSite;
psp: IServiceProvider;
pwb2: IWebBrowser2;
pvDoc: Variant;
pvElems: Variant;
pvElem: Variant;
i: Integer;
Getsite : string;
begin
punk:=Self.ComObject as IUnKnown;
if punk.QueryInterface(IOleObject, poo) = S_OK then
begin
// Get the client site
if poo.GetClientSite(pcs) = S_OK then
begin
// Have the site, now try to get the Service provider
if pcs.QueryInterface(IServiceProvider, psp) = S_OK then
begin
// Query for WebBrowser2
if psp.QueryService(IWebBrowserApp, IWebBrowser2, pwb2) = S_OK then
begin
memo1.Lines.Add(pwb2.LocationURL);
end
else
memo1.Lines.Add('Didnt get the web browser');
end
else
memo1.Lines.Add('No service provider');
end
else
memo1.Lines.Add('No ole client site');
end
else
memo1.Lines.Add('No ole object');
end;
但是无法编译这一行的代码 memo1.Lines.Add(getsite as IWebBrowser2.LocationURL);
修复了编译器错误
这是好方法还是我可以做得更好?
您的 ActiveX 控件的 IOleObject.SetClientSite()
方法将接收浏览器的 IClientSite
接口,您可以使用该接口检索已加载您的 ActiveX 的 HTML 页面的 URL控制。根据您的 Internet Explorer 版本,有两种不同的方法可以做到这一点。
查询IClientSite
得到IServiceProvider
,然后调用IServiceProvider.QueryService()
得到IWebBrowser2
,然后就可以读取IWebBrowser2.LocationURL
属性.
查询 IClientSite
为 IHTMLDocument2
,然后读取 IHTMLDocument2.URL
属性。
有关详细信息,请参阅以下 MSN 文章:
我正在尝试抓取 url 页面 运行 我的 activex ,我使用了 DDEMAN
单元,但它似乎在 activex 中不起作用,这是我所做的
function Get_URL(Servicio: string): String;
var
Cliente_DDE: TDDEClientConv;
S: String;
begin
Result := '';
Cliente_DDE := TDDEClientConv.Create(nil);
with Cliente_DDE do
begin
SetLink(Servicio, 'WWW_GetWindowInfo');
S := RequestData('0xFFFFFFFF');
Result := S;
form1.memo1.Lines.Add(Result);
CloseLink;
end;
Cliente_DDE.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
URI: TIdURI;
LinK : String;
Temp: string;
Host,sExt: String;
Path : string;
begin
Link := Get_URL('Iexplore');
Temp := Copy(Link, 1, Pos(',', Link) - 1);
Temp := StringReplace(Temp, '"', '', [rfReplaceAll]);
URI := TIdURI.Create(Temp);
try
Host := URI.Host;
Path := URI.Path;
Host := StringReplace(Host ,'www.', '',[rfReplaceAll,rfIgnoreCase]);
sExt := ExtractFileExt(Host);
Host := Copy(Host, 1, Length(Host) - Length(sExt));
finally
URI.Free;
end;
end;
在 运行 之后,代码似乎 GET_URL 函数 return 空结果 ActiveX
。我在 exe 上测试了这段代码,它工作正常。可能是什么问题呢 ?如何使用 ActiveX 在 IE 中正确地获得 URL 而 运行 ?
按照雷米的建议我试过了
procedure Tactiveform.Button1Click(Sender: TObject);
var
punk: IUnknown;
poo: IOleObject;
pcs: IOleClientSite;
psp: IServiceProvider;
pwb2: IWebBrowser2;
pvDoc: Variant;
pvElems: Variant;
pvElem: Variant;
i: Integer;
Getsite : string;
begin
punk:=Self.ComObject as IUnKnown;
if punk.QueryInterface(IOleObject, poo) = S_OK then
begin
// Get the client site
if poo.GetClientSite(pcs) = S_OK then
begin
// Have the site, now try to get the Service provider
if pcs.QueryInterface(IServiceProvider, psp) = S_OK then
begin
// Query for WebBrowser2
if psp.QueryService(IWebBrowserApp, IWebBrowser2, pwb2) = S_OK then
begin
memo1.Lines.Add(pwb2.LocationURL);
end
else
memo1.Lines.Add('Didnt get the web browser');
end
else
memo1.Lines.Add('No service provider');
end
else
memo1.Lines.Add('No ole client site');
end
else
memo1.Lines.Add('No ole object');
end;
但是无法编译这一行的代码 memo1.Lines.Add(getsite as IWebBrowser2.LocationURL);
修复了编译器错误
这是好方法还是我可以做得更好?
您的 ActiveX 控件的 IOleObject.SetClientSite()
方法将接收浏览器的 IClientSite
接口,您可以使用该接口检索已加载您的 ActiveX 的 HTML 页面的 URL控制。根据您的 Internet Explorer 版本,有两种不同的方法可以做到这一点。
查询
IClientSite
得到IServiceProvider
,然后调用IServiceProvider.QueryService()
得到IWebBrowser2
,然后就可以读取IWebBrowser2.LocationURL
属性.查询
IClientSite
为IHTMLDocument2
,然后读取IHTMLDocument2.URL
属性。
有关详细信息,请参阅以下 MSN 文章: