AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser

Ein Thema von BobTheBuilder · begonnen am 15. Nov 2019 · letzter Beitrag vom 21. Nov 2019
Antwort Antwort
BobTheBuilder

Registriert seit: 10. Apr 2019
18 Beiträge
 
#1

Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser

  Alt 15. Nov 2019, 16:30
Delphi-Version: 10.2 Tokyo
Hallo zusammen,

(Ich benutze Delphi 10.3, aber das kann man irgendwie nicht auswählen)

ich habe gemerkt, dass ich mich mit Interfaces überhaupt nicht auskenne und auf dem Schlauch stehe, um eine theoretisch sehr einfache Erweiterung an einem Beispiel vorzunehmen.

Beispiel kommt aus der Antwort von hier:
https://stackoverflow.com/questions/...lphi-c-builder

Einfach den Code in eine Form kopieren (und vielleicht den Form-Namen berichtigen) und schon hat man Edge als Steuerelement in einer Form laufen.

Ich benötige jetzt die Möglichkeit, das Steuerelement eine POST Anfrage machen zu lassen.

Da ich sowieso schon auf Stackoverflow das Beispiel gefunden hatte, habe ich mir gedacht, dass ich das auch direkt dort frage, auch wenn es leider bisher keine lösenden Antworten gegeben hat: https://stackoverflow.com/questions/...69770#58869770

Deswegen habe ich mir gedacht, dass ja eventuell hier jemand den Durchblick hat und mir helfen kann:

Ich will das IWebViewControl Interface um diese procedure erweitern:
Code:
procedure NavigateWithHttpRequestMessage(requestMessage: IHttpRequestMessage); stdcall;
Dazu brauche ich jedoch jetzt das IHttpRequestMessage Interface, das ich mir im Windows 10 Kit rausgesucht habe:
Code:
[exclusiveto(Windows.Web.Http.HttpRequestMessage)]
[uuid(F5762B3C-74D4-4811-B5DC-9F8B4E2F9ABF)]
interface IHttpRequestMessage : IInspectable
{
[propget] HRESULT Content([out] [retval] Windows.Web.Http.IHttpContent** value);
[propput] HRESULT Content([in] Windows.Web.Http.IHttpContent* value);
[propget] HRESULT Headers([out] [retval] Windows.Web.Http.Headers.HttpRequestHeaderCollection** value);
[propget] HRESULT Method([out] [retval] Windows.Web.Http.HttpMethod** value);
[propput] HRESULT Method([in] Windows.Web.Http.HttpMethod* value);
[propget] HRESULT Properties([out] [retval] Windows.Foundation.Collections.IMap<HSTRING, IInspectable*>** value);
[propget] HRESULT RequestUri([out] [retval] Windows.Foundation.Uri** value);
[propput] HRESULT RequestUri([in] Windows.Foundation.Uri* value);
[propget] HRESULT TransportInformation([out] [retval] Windows.Web.Http.HttpTransportInformation** value);
}
Wenn ich das richtig verstanden habe, ist das die (teilweise) Übersetzung:
Code:
IHttpRequestMessage = interface(IInspectable)
  ['{F5762B3C-74D4-4811-B5DC-9F8B4E2F9ABF}']
    procedure Placeholder_ContentGet; safecall;
    procedure Placeholder_ContentPut; safecall;
    procedure Placeholder_HeadersGet; safecall;
    procedure Placeholder_MethodGet; safecall;
    procedure Placeholder_MethodPut; safecall;
    procedure Placeholder_PropertiesGet; safecall;
    procedure Placeholder_RequestUriGet; safecall;
    procedure Placeholder_RequestUriPut; safecall;
    procedure Placeholder_TransportInformationGet; safecall;
  end;
Was ich nun garnicht verstehe: Wie erzeuge ich davon nun ein Objekt?

Ich habe schonmal in die TLBs von Activex DLLs reingeguckt und gesehen, dass die passenden Objekte per CreateComObject() erzeugt werden, aber wenn ich die GUID des Interfaces da rein gebe, dann sagt er mir, dass die Klasse nicht registriert wäre. Übersehe ich da etwas Offensichtliches oder bin ich vielleicht völlig auf dem Holzweg?

Vielleicht hat ja einer von euch etwas mehr Ahnung von Interfaces und kann mir zumindest die generelle Richtung weisen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser

  Alt 15. Nov 2019, 17:03
Bevor du weiter Zeit investierst: Schmeiß es weg.
MS begräbt den Edge-Browser und schwenkt auf Chromium um
D.h. diese Interfaces könnten in ein paar Monaten "verwaist" sein.

Am besten gleich Chromium nutzen
https://github.com/salvadordf/CEF4Delphi

Evtl. gibt es dann mal eine Lösung wie man den "Edge"-Chromium nutzen kann, so das man die DLLs nicht selbst in den eigenen Installer bringen muss.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
BobTheBuilder

Registriert seit: 10. Apr 2019
18 Beiträge
 
#3

AW: Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser

  Alt 15. Nov 2019, 18:08
Ich gehe mal stark davon aus, dass man diesen "Edge mit Webkit als Basis" dann ganz normal über dieses WebView Interface nutzen kann. Dann darfst Du nämlich von CEF zum WebView schwenken.

Und es sind ja nicht mal große Bemühungen, die ich da anstellen muss. Ich muss ja nur wissen, wie das mit den Interfaces funktioniert und dann ist das Problem vermutlich in 5 Minuten gelöst. Das ist mir lieber, als jetzt Zeit darin zu investieren, eine für den Kunden und mich als Supporter angenehme Lösung mit CEF zu basteln.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser

  Alt 15. Nov 2019, 18:50
Ich gehe mal stark davon aus, dass man diesen "Edge mit Webkit als Basis" dann ganz normal über dieses WebView Interface nutzen kann. Dann darfst Du nämlich von CEF zum WebView schwenken.
Du gest davon aus. Du hast ja ein großes Vertrauen in MS.
Wenn man so sieht was MS in den letzten Jahren groß angekündigt hat und dann mit "War doch nichts" relativ schnell beerdigt hat.
Und eine "Edge mit Webkit" ist es auch nicht Chromium ist die Basis und die setzt auf Blink, welche mit WebKit evtl. noch ein paar leerzeilen im Quellcode gemein hat.

Und ich muss sicherlich nicht schwenken. Wir haben CEF drin und an Chromium-Ecke hat MS 0,0% Einfluss. Eher Google wenn es die Versorgung von Chromium abkappt. Dann hat aber MS (und dutzende andere Browser) ein anderes Problem.

Und es sind ja nicht mal große Bemühungen, die ich da anstellen muss. Ich muss ja nur wissen, wie das mit den Interfaces funktioniert und dann ist das Problem vermutlich in 5 Minuten gelöst. Das ist mir lieber, als jetzt Zeit darin zu investieren, eine für den Kunden und mich als Supporter angenehme Lösung mit CEF zu basteln.
Als wenn ich sehe wo du gerade stehst ist das wohl ein "nicht mal große Bemühungen" darauf basierend das du noch nicht siehst welche zig anderen Interfaces noch vor dir legen werden.
Ich war auch schon mal auf der Suche ob es für Edge ein brauchbare integration gibt - Da gab es gar nix. Und Mannmonate zu investieren um da was hinzubekommen wollte ich nicht machen.
Chromium war in einen Tag eingebaut. Dann noch 1-2 tage und wir hatten auch erste Anbindungen an den HTML-DOM realisiert.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
BobTheBuilder

Registriert seit: 10. Apr 2019
18 Beiträge
 
#5

AW: Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser

  Alt 15. Nov 2019, 19:23
Unser Anwendungsfall beschränkt sich darauf, den Login per POST zu realisieren. Daten kommen per lokalem HTTP Server und hook-URL zurück. Ich brauche also tatsächlich nur diese eine Funktion und bin glücklich.
  Mit Zitat antworten Zitat
BobTheBuilder

Registriert seit: 10. Apr 2019
18 Beiträge
 
#6

AW: Probleme mit Interfaces beim Nutzen von Edge/WebView als Ersatz für TWebBrowser

  Alt 21. Nov 2019, 19:51
Falls irgendwann jemand auf das gleiche Problem stößt, wie man Interfaces von WinRT oder auch Com richtig benutzt:

So könnte zB das Interface der HttpRequestMessage aussehen:
Code:
  [WinRTClassNameAttribute('Windows.Web.Http.HttpRequestMessage')]
  IHttpRequestMessage = interface(IInspectable)
  ['{F5762B3C-74D4-4811-B5DC-9F8B4E2F9ABF}']
    procedure Placeholder_ContentGet; safecall;
    procedure Placeholder_ContentPut; safecall;
    procedure Placeholder_HeadersGet; safecall;
    procedure Placeholder_MethodGet; safecall;
    procedure put_Method(value:IHttpMethod); safecall;
    procedure Placeholder_PropertiesGet; safecall;
    procedure Placeholder_RequestUriGet; safecall;
    procedure put_RequestUri(source: IUriRuntimeClass); safecall;
//    procedure Placeholder_TransportInformationGet; safecall;
  end;
Wichtig ist, dass das WinRTClassNameAttribute mit dem aus der header-Datei oder der .idl übereinstimmt und dass natürlich die UUID auch passt.

Alle Methoden, die man nicht braucht, die aber vor den benutzten Methoden stehen, muss man trotzdem als Platzhalter anlegen. Ich hatte hier jetzt nur mit put_Method und put_RequestUri ausprobiert. Die beiden funktionieren aber wie gewünscht. Die Namen der Methoden sind gleich derer in der header-Datei. In der .idl werden die aufgrund von Schlüsselwörtern weggelassen. Also immer schön die Namen aus der header-Datei benutzen.

Wie bekommt man davon jetzt ein Objekt? Mit folgender CoClass:
Code:
THttpRequestMessage = class(TWinRTGenericImportI<IHttpRequestMessage>)
  end;
Hätte ich keine Tomaten auf den Augen gehabt, hätte ich gesehen, dass genauso auch die TWebViewControllProcess Klasse erstellt wird.

Diese THttpRequestMessage kann man jetzt ganz normal vor dem Aufruf von NavigateWithHttpRequestMessage mit .Create erstellen und so befüllen, wie man das für Richtig hält.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz