[ActiveX] obtenir l'URL de la page web [Résolu]

Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
- - Dernière réponse : cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
- 2 juin 2009 à 13:00
bonjour,

je cherche à obtenir l'URL de la page host de mon activeX. ça devrait être simple, non?

J'ai fais plusieurs recherches sur delphifr et d'autre forum sans rien trouver sur ce sujet.

Dans la MS KB, il y a l'article 181678 qui indique que cela est possible, mais je ne trouve pas comment utiliser l'implementation en Delphi.

J'ai trouver la Class (hum, je veux dire Interface) IOleClientSite (00000118-0000-0000-C000-000000000046) dans ActiveX.pas

Mais il semblerais que TActiveForm ne l'implemente pas, ni ne descend de TOleControl.

Est-ce possible avec les versions récentes de IE? Avez-vous de l'xp avec ce type de de problème?

Comment je suis neebie en ActiveX et que je n'ai jamais vraiment bosser avec COM, j'apprécierais vraiment un peu d'aide...

merci,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
3
Merci
bon....

pour finir, j'ai fais cette solution, pas parfaite, mais suffisante:

Elle a le defaut de retourner les URL de tous les tab de la fenêtre.

URLs := getURLOwnerOfActiveX(_getParentHwnd())

function _getParentHwnd(): integer;
var c: TWinControl;
begin
  c := self;
  result := c.Handle;

  while c.parent <> nil do begin
    c := c.parent;
    result := c.Handle;
  end;
end;

uses
SHDocVw, strUtils, ActiveX, UIntList;

function getURLOwnerOfActiveX(aParentHWND : integer):TStringList;
// return The URL of the web page displaying the ActiveX Form
// aParentHWND: the Handle of the ActiveX Form. (NOT of the parent of the ActiveX Form)
//
// list all the (not local) URL (tab) of the browser showing the ActiveX.

// tested with IE: 6,7
var
  SW: TShellWindows;
  SWD: IDispatch;
  WebBrowser: IWebbrowser2;
  c: integer; //count

  Handle : THandle;
  WindowsTree : TIntList;

begin
  result := TStringList.create;

  //
  // From the hanlde of the Form (ActiveX), we create the list of his parent.
  //
  // see http://msdn.microsoft.com/en-us/library/ms633510.aspx
  // (Diff. between parent and owner. Why we cannot use getParent() )
  //
  WindowsTree := TintList.Create();
  try

    //result.Add('Windows Tree');
    Handle := aParentHWND;
    repeat
      WindowsTree.add(Handle);
      //result.Add(inttostr(Handle) + ' - ' + IntToHex(Handle,8)); //debug
      Handle := GetAncestor(Handle,GA_PARENT); //
    until Handle = 0;

    //
    // We list the windows using explorer. (local file or IE)
    //

    SW := TShellWindows.Create(nil);
    try
      //result.Add('WB Tree');
      for c := 0 to SW.Count - 1 do //all shell windows
      begin
        SWD := SW.Item(c); //Get Interface Dispatch
        if SWD = nil then Continue;

        //if the windows is a IE browser
        SWD.QueryInterface(iWebBrowser2, WebBrowser);
        if (WebBrowser=nil) then continue;

        //Browsing?
        if WebBrowser.LocationURL = '' then Continue;

        //Drop the Windows Explorer windows (local file)
        if AnsiStartsText('file://',WebBrowser.LocationURL) then Continue;

        //result.Add(inttostr(WebBrowser.HWND) + ' - ' + IntToHex(WebBrowser.HWND,8));// debug

        //
        // This browser is the parent of the ActiveX
        //
        if (WindowsTree.IndexOf(WebBrowser.HWND) >= 0) then begin
          result.Add(WebBrowser.LocationURL); //Add URL form browser to list
        end;

      end;
    finally
      SW.Free;
    end;
  finally
    WindowsTree.Free;
  end;
end;

Si vous avez une autre idée, je suis intéressé par toute autre solution qui éviterait de lister les autres URLs.

A+

Loda

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
0
Merci
petite précision:

j'ai vu dans mon ProjectName_TLB.pas que l'implementation de mon ActiveForm descend de TOleControl (qui implement IOleClientSite) et non de TActiveForm.

Mais j'ignore comment je pourrait l'utiliser. (le getInterface ne me retourne pas de IOleClientSite) et de plus, l'implementation de TOleControl ne gère pas les paramètres (abstract implementation). Et je suis un peu perdu avec cette histoire de double déclaration de mon activeForm...

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda