2016-05-13 73 views
0

我試圖搶跑我的ActiveX,我用DDEMAN單元頁的URL,但它似乎並沒有在運行的ActiveX其看來,代碼後在這裏工作我做了什麼如何正確抓住一個URL與IE與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功能在ActiveX返回空結果。我測試了這個代碼在EXE和它的正常工作。可能是什麼問題呢 ?如何正確獲取在IE中運行的ActiveX的ActiveX?

如雷米建議我嘗試

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);

編譯器錯誤固定

這是很好的方式無法編譯代碼或也許我可以做的更好?

+0

使用TWebBrowser接口而不是DDE。 – MartynA

+0

對不起,但我怎樣才能使用twebbrowser獲取IE地址的URL? – DelphiStudent

+0

@MartynA:'TWebBrowser'是圍繞嵌入式Web瀏覽器的組件封裝。在這種情況下,代碼位於在IE瀏覽器實例內部運行的ActiveX控件中。因此,它可以使用IE的DOM接口來訪問加載它的瀏覽器實例。 –

回答

1

您的ActiveX控件的IOleObject.SetClientSite()方法將接收瀏覽器的IClientSite接口,您可以使用該接口來檢索已加載ActiveX控件的HTML頁面的URL。有兩種不同的方式可以做到這一點,具體取決於您的Internet Explorer版本。

  1. 查詢的IClientSiteIServiceProvider,然後調用IServiceProvider.QueryService()得到一個IWebBrowser2,那麼你就可以讀取IWebBrowser2.LocationURL屬性。

  2. 查詢IClientSiteIHTMLDocument2,然後閱讀IHTMLDocument2.URL屬性。

詳情請參見下面的MSN文章:

Accessing the Object Model from Within an ActiveX Control

+0

我正在嘗試應用您建議的內容。我更新了我的問題中的代碼 – DelphiStudent

+0

您描述的有關獲取編譯器錯誤的問題與您爲'Button1Click()'顯示的代碼不匹配。什麼是實際的錯誤?另外,你有沒有嘗試過我上面提到的第二種方法?無論如何,您可能會這樣做,因爲它會返回ActiveX所在文檔的URL,而不是瀏覽器顯示的URL,例如,如果涉及HTML框架,則URL可能會有所不同。 –

+0

錯誤消失已經是我的壞我應該閱讀pwb2.LocationURL而不是IWebBrowser2.LocationURL,我也會嘗試第二種方法,非常感謝你 – DelphiStudent