IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Comment lancer msedge.exe avec une url, mais captif dans un TPanel ?


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut Comment lancer msedge.exe avec une url, mais captif dans un TPanel ?
    Je suis sous Delphi 6 PE et j'essaie de lancer EDGE (exécutable: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe).
    J'arrive à le lancer,, même avec une URL de départ,, mais je n'arrive pas à capter le handle, même via le ProcessID, pour pouvoir injecter la fenêtre Edge dans un TPanel (vis SetParent).
    Cela marche bien avec Notepad ou d'autres outils, mais pas avec Edge. Pourquoi ? Est-ce quelqu'un aurait une solutiion ?
    Merci !

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    Pourquoi ne pas plutôt utiliser un TWebBrowser, eventuellement trouver sur le net une version D6 d'un TEdgeBrowser : Introduction to Microsoft Edge WebView2
    l'OLE est LA bonne méthode, celle prévue par MS : Tu peux utiliser Visual Studio Express pour ce tuto Get started with WebView2 in Win32 apps ... tu pourrais d'ailleurs en faire une DLL pour l'utiliser dans Delphi comme Proxy si tu ne trouves pas un TEdgeBrowser compatible D6

    Tente un Import de TLB depuis D6 si ce menu est disponible en version Personnal ... cela sera plus rugueux d'utilisation que le TWebBrowser via les Interfaces directement mais Edge est bien complexe que IE, même la création du OLE ce n'est pas standard, voir CreateCoreWebView2EnvironmentWithOptions ... sans trouver un wrapper déjà écrit, cela me semble assez difficile, MS fourni un SDK que Embarcadero a traduit sous la forme du TCustomEdgeBrowser qui lui même sert en interne pour l'Engine Edge du TWebBrowser

    Edge comme Chrome lance plusieurs processus, plusieurs par onglets pour traiter en fond de tache l'affichage d'une page et les téléchargements.
    Tenter de chopper toutes les Fenêtres de Edge pour trouver celle qui correspond pourrait fonctionner un temps mais quand MS changera le navigateur, cela ne fonctionnera plus.

    Déjà avec IE la méthode du SetParent n'était pas très stable, alors avec Edge, cela sera pire.


    Tu peux aussi utiliser une intégration de Chromium, par exemple le projet CEF4Delphi et WebView4Delphi, on trouve D6 dans le .inc, possible que cela supporte encore cette version (surtout si cela supporte aussi Lazarus FPC, le code doit être le plus syntaxiquement simple que possible) sachant que le ReadMe mentionne encore D6 :

    CEF4Delphi was developed and tested on Delphi 12.2 and it has been tested in Delphi 6, Delphi XE, Delphi 10, Delphi 11 and Lazarus 3.6/FPC 3.2.2. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup, ShaiLeTroll. Tu me donnes une série de pistes qu je vais explorer une à une. Mais c'est dommage.

    Avec TWebBrowser basé sur InternetExpolrer, cela ne posait aucun problème. Mais cela ne fonctionne plus avec W10 et W11. Je suis donc contraint de trouver une nouvelle solution.

    Tu me dis que je pourraiis essayer tous les processus msedge.exe pour trouver celui qui représente la fenêtre principale. Je vais commencer par cela, via une énumération des processus actifs (ce que je sais faire). Puis, je vais tenter les autres pistes.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    Avec TWebBrowser, as-tu mis l'émulation 11 ?
    Je l'utilise encore pour des écrans de consentement OAuth via REST.Authenticator.OAuth.WebForm.Win en D10 qui n'a pas non plus de TEdgeBrowser

    Avant de faire le Navigate, je lance ceci, je le lance même avant de créer l'instance de Tfrm_OAuthWebForm, je me suis fait une classe pour encapulser cet objet VCL, tu as un exemple REST.RESTDemo Sample qui utilise le TWebBrowser pour le consentement OAuth, travaillant beaucoup avec des services REST, le TWebBrowser est vraiment un composant clé dans la chaine d'obtention de token (quand il n'y a pas de auto-sign via HMAC)

    Je te confirme qu'un moment, je dirais, il y a 6 mois, j'ai eu des difficultés aussi avec le TWebBrowser, Google Auth le refusait mais je n'ai plus le problème, j'avais même commencé à étudier le TEdgeBrowser pour voir, mais finalement, cela fonctionne de nouveau.


    Je le fais aussi dans un autre projet où j'affiche du MarkDown converti en HTML (un outil genre Git mais orienté DB)

    Cela fonctionne en 32 et 64 bits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    procedure CheckWebBrowserEmulation();
      const
        KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';
      var
        Reg: TRegistry;
        EmulationLevel: Integer;
      begin
        EmulationLevel := 0;
     
        Reg := TRegistry.Create(KEY_QUERY_VALUE);
        try
          Reg.RootKey := HKEY_CURRENT_USER;
          if Reg.OpenKey(KEY, False) then
            if Reg.ValueExists(ExtractFileName(Application.ExeName)) then
              EmulationLevel := Reg.ReadInteger(ExtractFileName(Application.ExeName))
        finally
          Reg.Free();
        end;
     
        if EmulationLevel <> 11000 then
        begin
          if MessageDlg(Format('Allow Change WebBrowser Emulation Level from %d to 11000 ?', [EmulationLevel]), mtConfirmation, mbYesNo, 0) = mrYes then
          begin
            Reg := TRegistry.Create(KEY_SET_VALUE);
            try
              Reg.RootKey := HKEY_CURRENT_USER;
              if Reg.OpenKey(KEY, True) then
              begin
                Reg.WriteInteger(ExtractFileName(Application.ExeName), 11000);
                CheckOSError(Reg.LastError);
              end
              else
                CheckOSError(Reg.LastError);
            finally
              Reg.Free();
            end;
          end;
        end;
      end;
    Application.ExeName, si c'est dans une DLL, à remplacer par GetModuleName(0) ou ParamStr(0) car c'est l'EXE qui compte je pense



    Au cas où, je gère maintenant un mode Browser externe au lieu de l'intégrer, pour mes besoins, cela ne pose pas problème pour le moment.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    Mince, je me rends compte que je t'avais déjà donné ce code dans Est-ce qu'il y a un composant ou xrapper pour WebView2 pour DELPHI 6 ? ... je suppose que tu l'utilises déjà !

    On avait déjà évoqué dans ce sujet CreateWebViewEnvironmentWithOptionsInternal fourni par WebView2Loader.dll (installée par MicrosoftEdgeWebView2RuntimeInstallerX86), je ne sais pas si tu avais poussé plus en 2022 ton étude de ce point d'entrée, à la vue du code Delphi du TEdgeBrowser, c'est le début à tout mais pas simple !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    @ShaiLeTroll:
    Oui, je sais faire cela. Cette astuce est déjà mise en oeuvre dans ma DLL pour deux choses distinctes:
    - mise en place d'une ImageLibrary pour des icônes spécifiques
    - installation d'un programme de mise à jour de ma DLL, à la demande

    Ceci dit, je reiens sur ma question initiale:
    Pourquoi m'est-il impossible d'injecter programmatiquement un TEdgeBrowser créé programmatiquement dans un TPanel créé programmatiquement ?

    Je joins un fichier ZIP avec deux projets: KGF_Edge qui crée la DLL contenant le EdgeBrowser, et Test_KGF_Edge qui crée un programme chargeant cette DLL dynamiquement. La DLL généré n'est pas dans le ZIP, ni l'exe du programme démo - le téléchargement l'interdir.
    Ce dernier a 4 boutons, et seul le bouton de gauche est intéressant pour le moment: "Create KGF_Edge".
    Lors de la création de la Form1, KGF_Edge.dll est chargée dynamiquement et les liens vers ses 3 fonctions sont établis et memorisés.
    La fonction affiche d'ailleurs la valeur de la variable d'environnement PATH pour vérifier que le chemin vers la DLL de WebView2 est bien présent (à la fin).
    Le bouton "Create KGF_Edge" appelle la fonction Create_KGF_EDGE.
    Cette fonction, localisée dans la DLL, est bien appelée et démarre. Des messages indiquent son état d'avancement.
    Ainsi, on constate que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Edge.ParentWindow := Handle;
    de cette fonction génère une violation de mémoire. Pourquoi ?

    En Delphi 6, je fais ça tout le temps, sans aucun problème.
    Est-ce une différence avec Delphi 12 ?
    Est-ce TEdgeBrowser qui ne supporte pas cela ?
    Fichiers attachés Fichiers attachés

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 932
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 932
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    Pourquoi m'est-il impossible d'injecter programmatiquement un TEdgeBrowser créé programmatiquement dans un TPanel créé programmatiquement ?
    Parce que ton code est bogué

    1. Tu masques l'exception dans Create_KGF_EDGE, ce n'est pas une erreur mais ça n'aide pas.
    2. Tu renommes le constructeur CreateNew, pourquoi pas puisque l'instanciation est dynamique, mais inherited ne sert à rien puisque cette méthode n'existe pas dans ses ancêtres.
    3. Create n'est pas appelé suite à ce renommage, l'objet n'est pas correctement initialisé.
    4. Edge.ParentWindow := Handle n'est pas possible à ce moment-là puisque ce panel n'a ni propriétaire, ni parent (l'exception masquée au point 1), TWinControl.CreateWnd échoue.
    5. Les procédures exportées sont en stdcall mais les prototypes côté exe ne le sont pas.


    Au minimum ceci (après correction côté exe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    constructor TKgfEdge.CreateNew(hDest :hWnd);
    begin
      Create(nil);
     
      ParentWindow := hDest;
      Edge := TEdgeBrowser.Create(self);
      Edge.Parent := Self;
      ...
    end;
    La destruction aussi est surprenante.

    1. result := aKEB : tu comptes retourner une instance libérée !
    2. if assigned(aKEB) then exit si assigné, ne libère rien !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure Delete_KGF_EDGE(aKEB: TObject); stdcall; export;
    begin
      if aKEB is TKgfEdge then
        aKEB.Free;
    end;

  8. #8
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Très bien ! Ceci élimine la nécessité de copier la DLL dans le dossier de l'exécutable, et on n'a pas besoin d'installer la DLL dans le dossier système de Widows,pour une installation client.

    Tout fonctionne maintenant, sauf un dernier détail: l'obet initial de mon post, c'eat-a-dire créer le TEdgeBrowser dans un TPanel, lui aussi créé programmatiquement par la DLL.

    J'avais l'habitude de procéder ainsi, sous Delphi D6 PE:
    1 - dériver un TMyPanel d'un TPanel
    2 - y placer une variable privée fMyControl et créer une propriété Mycontrol accédant cette variable
    3 - créer programmatiquement un TMyPanel
    4 - créer ensuite programmatiquement un objet quelconque (un TSynedit par exemple)
    5 - placer visuellement le second objet dans le TMyPanel en changeant sa propriété ParentWindow pour y mettre le handle du TPanel
    6 - mémoriser le second objet dans la variable fMyControl de l'objet MyPanel
    7 - fournir MyPanel (tohours résidant dans la DLL) au programme appelant (hors DLL)
    8 - ce programme appelant, sans jamais utiliser directement cette valeur retournée, l'utilise alors comme "identifiant" pour des fonctions DLL travaillant avec cet objet

    Tout ceci marche parfaitement en D6. Mais ici, avec Delphi 12, j'ai une violation de mémoire au moment d'affecter le handle de TMuPanel à ParentWindow du TWebBrowser, alors que je n'ai pas encore quitté la DLL - je suis encore à la phase (5).

    Volici un extrai de mon code - la déclaration de ma classe dérivée du TPanel et la procédure de constrction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    type TKgfEdge = class(TPanel)
      private
        fEdge: TEdgeBrowser;
        fReady: boolean;
        fIsSuccess: Boolean;
        fWebErrorStatus: COREWEBVIEW2_WEB_ERROR_STATUS;
      published
        constructor CreateNew;
        destructor Destroy; override;
        procedure NavigationCompleted(Sender: TCustomEdgeBrowser;
          aIsSuccess: Boolean; aWebErrorStatus: COREWEBVIEW2_WEB_ERROR_STATUS);
      property Edge: TEdgeBrowser read fEdge write fEdge;
      property Ready: boolean read fReady write fReady;
      property IsSuccess: boolean read fIsSuccess write fReady;
      property WebErrorStatus: COREWEBVIEW2_WEB_ERROR_STATUS read fWebErrorStatus write fWebErrorStatus;
     
      end;
     
     
     
    implementation
     
    constructor TKgfEdge.CreateNew;
    begin
      inherited;
    showmessage('CreateNew - start');
      Edge := TEdgeBrowser.Create(nil);
    showmessage('CreateNew - 1');
      fReady := true;
    //  Edge.Parent := Self;
    showmessage('CreateNew - 2');
      Edge.ParentWindow := Handle;
    showmessage('CreateNew - 3');
      Edge.Top := 0;
      Edge.Left := 0;
      Edge.Width := self.ClientWidth;
      Edge.Height := self.ClientHeight;
    showmessage('CreateNew - 4');
      Edge.OnNavigationCompleted := NavigationCompleted;
    showmessage('CreateNew - fin');
    end;
    La violation de mémoire intervient lors de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Edge.ParentWindow := Handle;
    Chose qui fonctionnait parfaitement en D6.

    A l'évidence, me saut de D6 à D12 est énorme...
    -

  9. #9
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup, ShaiLeTroll !

    Ta procédure CheckWebBrowserEmulation a débloqué mon problème et a permis d'utiliser TWebBrowser sous W10 et W11.

    Je n'ai donc pls bsoin de recourir à Edge ou un artifice quelconque.

    Parfait ! Marci !

  10. #10
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Oups... je pensais le problème résolu, mais que nenni !

    La page ciblée semle s'affichier correctement.
    Cependant, des parties manquent, en en allant plus loin, le browser m'affiche:
    Nom : aa2.PNG
Affichages : 85
Taille : 3,5 Ko

    En cliquant sur "Learn more", j'obtiens:
    [Nom : aa1.png
Affichages : 80
Taille : 11,3 Ko

    L'émulation est bien établie avec la valeur 11:
    Nom : aa3.png
Affichages : 81
Taille : 23,7 Ko

    D'ailleurs, aucun lien vers une autre page ne fonctionne.

    Le comportement est le même si je place la valeur 0 dans le paramètre émulation.

    Voici le lien vers la page que je veux afficher: http://klauspanoramic.infinityfreeap...aireIndex.html

    Là, je suis à nouveau coincé...
    Images attachées Images attachées  

  11. #11
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Comme je suis bloqué avec TWebBrowser, j'ai essayé WebView4Delphi.
    Je l'ai téléchargé et décompressé, j'ai copié le dossier dans mon dossier Borland\Delphi6\, puis j'ai ajouté le chemin vers ce dossier aux chemins de bibliothèque.
    Puis, suivant les instructions d'installation pour D6, j'ai ouvert WebView4Delphi.dpk.
    Je lance la compilation et j'obtiens:
    Nom : aa1.png
Affichages : 111
Taille : 21,7 Ko

    Or, je ne trouve aucun lien de téléchargement vers ce patch qui fonctionne. Je sais que le primier patch a été installé, mais pas le second. Comment puis-je faire pour récupérer ce patch, pour installer WebView4Delphi ou pour faire marcher TWebBrowser ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 60
    Par défaut
    salut ici https://github.com/salvadordf/WebView4Delphi
    il a l'air assez ressent mais je suppose que tu l'a déjà vu

  13. #13
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Eureka ! Merci à vous tous ! Vos suggestions m'ont ouvert la voie. Tout marche maintenant.

    Voici la version finale, permettant d'injecter dans une form un TPanel construit programmatiquement, cmprenant un TEdgeBrowser lui aussi construit programmatiquement.

    Cette version, encore de style "démo", affiche quelques messages de traçage. L'utilisation est la suivante:
    1. avant tout, créer la DLL enconstruisant le projet KGF_Edge (KGF_Edge.dll)
    2. puis créer le programme de démo en construisant le projet Test_KGF_Edge (Test_KGF_Edge.exe)
    3. lancer Test_KGF_Edge.exe

    On obtient ceci:
    Nom : aa1.png
Affichages : 63
Taille : 4,9 Ko

    4. commencer par le bouton "Create KGF_Edge"

    On ontient ceci:
    Nom : aa2.PNG
Affichages : 65
Taille : 6,0 Ko

    On voit bien le panel ainsi que le EdgeBrowser (en blanc).

    5. utiliser un des boutons "Load Google" ou "Load Help"
    Pour Google, on obtient ceci:
    Nom : aa3.png
Affichages : 64
Taille : 28,2 Ko

    6.le bouton "Delete KGF_Edge" supprime le browser et le panel
    7. la croix rouge supprime le browser et le panel si ce n'est pas encore fait, puis termine le programme.

    Voilà ce que je volais obtenir. Grâce à vos suggestions, j'y suis arrivé.
    Prochaine étape: intéger KGF_Edge.dll comme ressource dans ma grande DLL et l'en extraire en cas de besoin. Mais ça, je sais faire.
    Un grand MERCI à vous tous !
    Fichiers attachés Fichiers attachés

  14. #14
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Oui, c'est à partir de ce site que j'ai téléchargé WebView4Delphi.

    Et c'est ainsi que je me heurte à ce problème de compilation car ma version de Delphi 6 PE n'a pas le second patch mentionné dans le commentaire sur la ligne en erreur.

    Et j'ai beau chercher sur le net pour pouvoir télécharger ce patch. Je trouve plusieurs liens, mais soit les liens sont motrs (erreur 404), soit l'accèe est interdir - va savoir pourquoi.

    Et voilà - cela me ramèce à mon problème initial. Le site dont je veux afficher les pages, s'affiche correctement dans Firefox, Opera, Edge, Internet Explorer sous W10 (et donc émulé par Edge), Brave, ... Seul WebBrowser (émulé par Edge sous W10) n'est pas capable de le faire.

    Auparavent, j'arrivais à capturer un browser et à l'attacher à un TPanel via l'API SetParent, mais je n'y arrive pas avec Edge. J'arrive bien à lancer programmatiquement Edge avec l'URL en question, soit par CreateProcess, soit par ShellExecute ou ShellExecuteEX, mais je n'arrive pas à déterminer le handle de la fenêtre significative pour la capturer dans mon TPanel.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 60
    Par défaut
    à lire https://en.delphipraxis.net/topic/59...ebview4delphi/
    il semble que quelqu'un dit que ce compo ne fonctionne qu'à partir de D7 et propose autre chose

  16. #16
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    Citation Envoyé par papyvore Voir le message
    à lire https://en.delphipraxis.net/topic/59...ebview4delphi/
    il semble que quelqu'un dit que ce compo ne fonctionne qu'à partir de D7 et propose autre chose
    Euh ... klaus49 c'est pas le même que KlausGunther ?
    Tu n'aurais pas oublié cette tentative ?

    Unfortunately, I'm really stuck to Delphi 6 PE. I'm implementing a (huge) support DLL for another language, and all the stuff is writte, in Delphi 6 PE.

    Actually, there are over 1300 support functions available, all fully documented in french and english.
    un pseudo proche et un projet qui semble le même, la fameuse DLL pour Panoramic



    Sinon pour quoi ne pas faire une SECONDE DLL ?
    Tes utilisateurs de Panoramic, utilise toujours la première DLL compilé en D6 mais tu y mets dedans des fonctions qui ne sont que des Proxy vers une seconde DLL compilée en Delphi Community (32bits) qui contient des fonctionnalités trop pénible en D6.
    Après tout ta DLL utilise déjà plein de DLL Windows, tu dois bien pouvoir lui faire utiliser une autre DLL de ta conception, en liaison dynamique, ainsi la seconde DLL est optionnelle, juste gérer un code d'erreur si l'on appel une fonction Proxy sans son implémentation présente dans la DLL secondaire.

    D'ailleurs, pour ta fonction de WebBrowser, tu peux ajouter une autre fonction de paramètrage pour forcer le mode IE ou le mode Edge, la fonction Proxy selon le paramètrage utilisera le WebBrowser D6 ou utilisera la DLL secondaire qui utilisele WebBrowser D11/D12 Engine Edge.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  17. #17
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    Faudrait retirer la ligne et voir à quel endroit c'est nécessaire ?
    Si cela se trouve c'est requis pour une fonctionnalité que tu n'utiliseras pas.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  18. #18
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Ben... C'est une idée.

    Initialement, j'avais une série de petites DLLs, organisées par grands domaines de fonctionnalités. Mais la maintenance devenait trop compliquée, et j'ai tout réuni en une seule. D'autant que le langage Panoramic (pour lequel je code cette DLL) n'autorise qu'une seule DLL externe à chaque instant. La gymnastique pour passer d'une DLL à une autre était trop lorde, sans parler du fait que, dans ce cas, on perdait tout le contexte des données globales d'une DLL en passant à une autre.

    Mais j'ai effectivement un mécanisme permettant d'ajouter des DLLs en liaison dynamique. Je vais donc prendre cette voie. Tu as raison - cela devrait marcher dans la Community Edition.

    J'ai déjà un mécanisme permettant d'aler chercher une DLL annexe dynaliquement? Actuellement, ma DLL est distribuée spus forme d'un seul fichier ZIP contenant ma DLL. Je vais donc inclure la DLL auxiliaire dans les ressources lors du link, puis, avant utilisation, vérifier si la DLL annexe existe bien sur le système et avec la bonne version, pour l'extraire si nécessaire. Il faut que ce soit automatique et transparent pour l'utilisateur. Mais j'ai déjà mis en place ce type de mécanisme pour un autre aspect (une bibliothèque d'icônes spécifiques). Donc, ça ira - je sais faire.

    Je m'y p^mets - y a plus qu'à...

    Merci !

  19. #19
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Désolé - je suis obligé de revenir à la charge.

    J'ai renouvellé ma licence Delphi 11 et j'ai installé en plus Delphi 12, les deux en Community Edition.
    J'ai configuré les deux ebvironnements à générer du code Windows 32 bits.

    Avant même de jouer avec les DLLs, j'ai créé un simple programme VCL avec un TWebBrowser et un TEdgeBrowser.
    Pour chacun de ces browsers,, j'ai ajouter deux boutons:
    - Charger Goole (condiut vers google.fr
    - Charger Aide ( conduit vers http://klauspanoramic.infinityfreeap...Index.html?i=1

    Résultats:
    TWebBrowser:
    Les deux boutons chargent ma bonne page.
    Mais le chargement est rapidement interrompu par une erreur car JavaScript n'est pas géré.
    TEdgeBrowser:
    Aucune action visible pour les deux boutons.
    Aucun message d'erreur.

    Je précise que depuis lontemps, j'ai installé les modules WebView2 de MicroSoft, en version 32 bits ET en version 64 bits.
    La mise à jour de ces modules se fait automatiquement, assez souvent.

    Je ne sais pas ce que je peux faire. Je mets en pièce jointe un fichier ZIP contenant le projet Test_Browsers complet pour Delphi 12.
    Je serais heureux si vous pouviez me mettre sur la piste...
    Merci d'avance
    Fichiers attachés Fichiers attachés

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 592
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Tant que c'était D6, je ne voulais pas m'impliquer dans cette discussion, pas de D6 chez moi et de plus quand je reprends D3 ou D7 j'ai tendance à me demander comment je me débrouillais avec

    Je me suis déjà battu avec ce TEdgeBrowser et pas toujours gagné

    Est-ce que les pré-requis ont bien été fait ?
    https://docwiki.embarcadero.com/RADS...nt_TWebBrowser

    1- Installation du package "Edge WebView2 SDK ...." via GetIt // je présume que cela a été fait
    1'- Installation des démos "EdgeBrowser Demo and Imports Update 1" via Getit pas obligatoire mais eut être utile
    2- Configuration de projet pour les DLL de chargement de WebView2 // ça, par contre ....
    Premier problème : "common_DLL_folder_path\x86\WebView2Loader.dll" n'est pas un chemin valide donc, la premiere chose est de trouver le bon chemin
    pour moi : C:\Users\serge\OneDrive\Documents\Embarcadero\Studio\23.0\CatalogRepository\EdgeView2SDK-1.0.2739.1\Bin\x86 (ou x64 selon la cible OS)
    ce onedrive est encore là
    ensuite
    Nom : Capture.PNG
Affichages : 91
Taille : 15,9 Ko
    (un mauvais chemin => erreur code 1 à la compilation)

    Un rapide test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    unit main;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.WebView2, Winapi.ActiveX,
      Vcl.Edge;
     
    type
      TForm1 = class(TForm)
        EdgeBrowser1: TEdgeBrowser;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    uses system.IOUtils;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      EdgeBrowser1.UserDataFolder := TPath.Combine(TPath.GetDirectoryName(Application.ExeName), 'CustomCache');
      EdgeBrowser1.Navigate('http://bing.com');
    end;
     
    end.
    et c'est ok, même si un peu lent à la détente

    ces trucs appliqués, ton programme fonctionne
    Nom : Capture.PNG
Affichages : 87
Taille : 20,8 Ko
    ou presque car j'ai une erreur sur ton bouton "Charger Google" (p.s. Edge préfère Bing)
    Sortie de débogage: Google.fr is not a valid url. Processus Test_Browser.exe (12816)
    la correction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      EdgeBrowser1.Navigate('http://Google.fr');  // ou https ?
    end;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/04/2014, 17h06
  2. [Windows Phone 8] [Debutant] Lancer le navigateur avec une url depuis une application
    Par krizentherm dans le forum Windows Phone
    Réponses: 3
    Dernier message: 06/04/2014, 12h39
  3. [Débutant] Comment lancer un exe avec un autre utilisateur que Système
    Par Amelie_sc dans le forum C#
    Réponses: 6
    Dernier message: 04/07/2013, 12h24
  4. [CKEditor] Comment configurer l'éditeur avec une url
    Par whitespirit dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 12/06/2008, 11h00
  5. comment lancer un exe avec parametre avec shell
    Par niceen dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/05/2008, 19h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo