如何使用 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 版本,有两种不同的方法可以做到这一点。

  1. 查询IClientSite得到IServiceProvider,然后调用IServiceProvider.QueryService()得到IWebBrowser2,然后就可以读取IWebBrowser2.LocationURL 属性.

  2. 查询 IClientSiteIHTMLDocument2,然后读取 IHTMLDocument2.URL 属性。

有关详细信息,请参阅以下 MSN 文章:

Accessing the Object Model from Within an ActiveX Control