Embedding Webkit- COM problem

Vse drugo, kar ne spada v nobeno zgornjo kategorijo.
Odgovori
Uporabniški avatar
krho
Prispevkov: 709
Pridružen: 11.01.2003 23:02:56

Embedding Webkit- COM problem

Odgovor Napisal/-a krho » 30.09.2009 22:41:10

Se že nekaj časa trudim embeddat Webkit v Delphi, pa mi počasi že zmanjkuje volje.
Ali jaz ne znam, ali pa Delphi nekaj po svoje šteje reference za Interface.

Kompleten projekt skupaj z vsemi dependenciji je na voljo za DL Delphi Webkit (5,7M)

Izvedba kode pod cmdOneStepClick deluje BP, ker IWebFrame ne gre iz reference.
Če hočemo jit po korakih, se izvedba kode pri klicu cmdCreateClick usuje nekje v kodi, ki jo doda Delphijev prevajalnik.

Koda: Izberi vse

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ExtCtrls, WebKit_TLB, WebKit_DLL;

type CoWebView1 = class
  public
    class function Create: IWebView;
end;

type
  TForm3 = class(TForm)
    cmdCreate: TButton;
    Panel1: TPanel;
    cmdLoad: TButton;
    cmdOneStep: TButton;
    procedure cmdCreateClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure cmdLoadClick(Sender: TObject);
    procedure cmdOneStepClick(Sender: TObject);
  private
    { Private declarations }
    wv: IWebView;
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.cmdCreateClick(Sender: TObject);
begin
//crkne z Access violation at addres 00000000. Read of address 00000000
//  WebKitInstance(@CLASS_WebView, nil, @IID_IWebView, wv);
//crkne v intf cast funkciji, ki jo zgradi delphi prevajalnik.
wv := WebKitCreateInstance2(CLASS_WebView, IID_IWebView) as IWebView;
end;

procedure TForm3.cmdLoadClick(Sender: TObject);
var wf: IWebFrame;
var r: tagRECT;
begin
  if wv.setHostWindow(Panel1.Handle) <> S_OK then Exit;
  r.left := 0;
  r.top := 0;
  r.bottom := Panel1.ClientHeight;
  r.right := Panel1.ClientWidth;
  if wv.initWithFrame(r, '12', '123') <> S_OK then Exit;
  if wv.mainFrame(&wf) <> S_OK then Exit;
  //wv.setPreferences(pref);

  if wf.loadHTMLString('<p>String loaded from WebKit embedded in <b>Delphi<b>.</p>', '') <> S_OK then Exit;
  //Result.setMainFrameURL()
end;

procedure TForm3.cmdOneStepClick(Sender: TObject);
var wf: IWebFrame;
var r: tagRECT;
begin
   WebKitInstance(@CLASS_WebView, nil, @IID_IWebView, wv);

  if wv.setHostWindow(Panel1.Handle) <> S_OK then Exit;
  r.left := 0;
  r.top := 0;
  r.bottom := Panel1.ClientHeight;
  r.right := Panel1.ClientWidth;
  if wv.initWithFrame(r, '12', '123') <> S_OK then Exit;
  if wv.mainFrame(&wf) <> S_OK then Exit;
  //wv.setPreferences(pref);

  if wf.loadHTMLString('<p>String loaded from WebKit embedded in <b>Delphi<b>.</p>', '') <> S_OK then Exit;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  LoadLibWebKit('');
end;

class function CoWebView1.Create: IWebView;
begin
  WebKitInstance(@CLASS_WebView, nil, @IID_IWebView, Result);// <> S_OK) WebKitCreateInstance2(CLASS_WebView, IID_IWebView);
  Result._AddRef;
end;

end.

Koda: Izberi vse

function WebKitCreateInstance2(const ClassID: TGUID; const InterfaceID: TGUID): IUnknown;
begin
  if (WebKitInstance(@ClassID, nil, @InterfaceID, Result) <> S_OK) then
    raise EWebKitInstance.Create(Format('Failed creating, ClassID: %s',[GuidToString(ClassID)]));
end;
Uredite zbirko filmov, tv serij in iger - http://xcollect.sf.net
Zamenjate leglo virusov s preprostim in naprednim odjemalcem elektronske pošte. - http://www.simail.si

Uporabniški avatar
krho
Prispevkov: 709
Pridružen: 11.01.2003 23:02:56

Embedding Webkit- COM problem

Odgovor Napisal/-a krho » 01.10.2009 19:13:07

Ok, tule nekaj tako smrdi, da to ni res....

Kljub temu, da koda v cmdCreateClick crkne z "Access violation at addres 00000000. Read of address 00000000" se vsebina po klicu na cmdLoadClick čisto lepo prikaže besedilo.
Uredite zbirko filmov, tv serij in iger - http://xcollect.sf.net
Zamenjate leglo virusov s preprostim in naprednim odjemalcem elektronske pošte. - http://www.simail.si

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Embedding Webkit- COM problem

Odgovor Napisal/-a Runner » 08.10.2009 12:28:14

Si videl tole?: http://stackoverflow.com/questions/3772 ... for-delphi

Ti si rekel da imaš neko opuljeno verzijo. Mogoče probaj po tej poti ki je opisana tam. Če dela z vso solato zraven, probaj nato zmanjševati obseg kode.

Uporabniški avatar
krho
Prispevkov: 709
Pridružen: 11.01.2003 23:02:56

Embedding Webkit- COM problem

Odgovor Napisal/-a krho » 08.10.2009 16:40:38

Oni tam priporoča uporabo xullrunerja oz. mozille.
Moj build ima samo zmanjšano št. dependencijev.

Moj build s testnim C++ programčkom deluje, prav tako deluje z zadnjim SDK buildom, ki ga pripravlja avtor.
Glede na to, da tudi, če uporabim officialy compiled SDK build zadeva crkne čisto enako.

Vse skupaj samo pomeni, da ali DLL zganja neke čudne čarovnije ali pa jih zganja Delphi. Bi poslal zadevo čez debugger, pa Visual studio noče naložiti Debug info za Dll...

Aja Delphi 2007, 2010 ne pomeni nobene razlike.

P.S. "Access violation at addres 00000000. Read of address 00000000" se zgodi v kernel32.dll vsaj, če znam pravilno v CPU viewu offsete prebrat.
:75d2b727 KERNELBASE.RaiseException + 0x58
:00405430 NotifyNonDelphiException + $1C
:7783878b ; ntdll.dll
:777f010f ntdll.KiUserExceptionDispatcher + 0xf
:00479de1 TWinControl.WndProc + $56D
:00455849 TButtonControl.WndProc + $71
:00479f34 DoControlMsg + $28
:00479de1 TWinControl.WndProc + $56D
:0049a355 TCustomForm.WndProc + $599
:0047947f TWinControl.MainWndProc + $2F
:0043c582 StdWndProc + $16
:75776238 ; C:\Windows\syswow64\USER32.dll
:757768ea ; C:\Windows\syswow64\USER32.dll
:7577cd1a ; C:\Windows\syswow64\USER32.dll
:7577cd81 USER32.SendMessageW + 0x4c
:73434e95 ; C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc\comctl32.dll
:73434ef7 ; C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc\comctl32.dll
:73434d89 ; C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7600.16385_none_421189da2b7fabfc\comctl32.dll
:75776238 ; C:\Windows\syswow64\USER32.dll
:757768ea ; C:\Windows\syswow64\USER32.dll
:75780ab0 ; C:\Windows\syswow64\USER32.dll
:75780ad6 USER32.CallWindowProcW + 0x1b
:00479ee1 TWinControl.DefaultHandler + $DD
:00479de1 TWinControl.WndProc + $56D
:00455849 TButtonControl.WndProc + $71
:0043c582 StdWndProc + $16
:75776238 ; C:\Windows\syswow64\USER32.dll
:757768ea ; C:\Windows\syswow64\USER32.dll
:75777d31 ; C:\Windows\syswow64\USER32.dll
:75777dfa USER32.DispatchMessageW + 0xf
Zadnjič spremenil krho, dne 08.10.2009 16:43:56, skupaj popravljeno 1 krat.
Uredite zbirko filmov, tv serij in iger - http://xcollect.sf.net
Zamenjate leglo virusov s preprostim in naprednim odjemalcem elektronske pošte. - http://www.simail.si

Miha-R
Prispevkov: 2155
Pridružen: 14.05.2001 21:29:53

Embedding Webkit- COM problem

Odgovor Napisal/-a Miha-R » 06.05.2010 20:29:04

Sem pobral tvoj primer, ga prevedel - in pri meni koda deluje. Potem sem našel vzrok - ti imaš vklopljeno optimizacijo, jaz jo imam po defaultu pa izklopljeno. Takole sem spremenil tvoj unit3:

Koda: Izberi vse

unit Unit3;

interface

{$OPTIMIZATION OFF}

uses
Vedno sem želel napisati prav tak odgovor.

Uporabniški avatar
krho
Prispevkov: 709
Pridružen: 11.01.2003 23:02:56

Embedding Webkit- COM problem

Odgovor Napisal/-a krho » 06.05.2010 20:59:08

Zabavno. Bi to kdo od višje uvrščenih reportal v QC? Zgleda, da prevajalnik optimizira malce preveč... Druga stvar, če bodo popravili kako daleč nazaj bodo šli...
Uredite zbirko filmov, tv serij in iger - http://xcollect.sf.net
Zamenjate leglo virusov s preprostim in naprednim odjemalcem elektronske pošte. - http://www.simail.si

Miha-R
Prispevkov: 2155
Pridružen: 14.05.2001 21:29:53

Embedding Webkit- COM problem

Odgovor Napisal/-a Miha-R » 06.05.2010 21:48:03

Enostavno izklopi optimizacijo v svojem programu in bo zadeva urejena.

Imam pa problem, kako s tem SDKjem odpreti spletno stran. Tvoji kodi cmdLoad sem dodal vrstico wv.setMainFrameURL('http://www.google.com') ampak ven dobim prazen zaslon. Any clue?

Uporabniški avatar
krho
Prispevkov: 709
Pridružen: 11.01.2003 23:02:56

Embedding Webkit- COM problem

Odgovor Napisal/-a krho » 07.05.2010 07:58:36

ja ker mora jit preko reqvesta

najprej daj Set8087CW($133f); v initialization od WebKit_DLL.pas

v cmdLoadClick namesto loadFrom string gre pa naslednje:

Koda: Izberi vse

  req := WebKitCreateInstance2(CLASS_WebMutableURLRequest, IID_IWebMutableURLRequest) as IWebMutableURLRequest;
  req.setURL('http://www.google.com');
  wf.loadRequest(req);
Zadnjič spremenil krho, dne 07.05.2010 08:01:15, skupaj popravljeno 1 krat.
Uredite zbirko filmov, tv serij in iger - http://xcollect.sf.net
Zamenjate leglo virusov s preprostim in naprednim odjemalcem elektronske pošte. - http://www.simail.si

Miha-R
Prispevkov: 2155
Pridružen: 14.05.2001 21:29:53

Embedding Webkit- COM problem

Odgovor Napisal/-a Miha-R » 07.05.2010 10:06:58

Super dela, hvala!
Vedno sem želel napisati prav tak odgovor.

Odgovori