Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Webbrowser Screenshot (https://www.delphipraxis.net/69655-webbrowser-screenshot.html)

toms 18. Mai 2006 07:20


Webbrowser Screenshot
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Ich möchte aus von einem beliebigen IE Fenster ein Vorschaubildchen erstellen.
Das funktioniert bestens mit der Funktion GetIEBitmap(), wenn ich einen TWebbrowser angebe.

Wenn ich jedoch auf ein IHTMLDocument2 von einem IE Fenster zugreife, gibt's am Ende von
Button1Click eine AV (Siehe auch Screenshot, asm Code)

Zitat:

---------------------------
Debugger Exception Notification
---------------------------
Project SaveIE.exe raised exception class EAccessViolation with message 'Access violation at address FEEEFEEE. Read of address FEEEFEEE'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Hat jemand eine Idee warum? Was müsste man ändern, damit's keine AV gibt?

Delphi-Quellcode:
function GetIEBitmap(IEDoc: IWebBrowser2): TBitmap;
var
  ViewObject: IViewObject;
  DrawRect: TRect;
begin
  Result := TBitmap.Create;
  Result.Width := IEDoc.Width;
  Result.Height := IEDoc.Height;
  if IEDoc.Document <> nil then
  begin
    IEDoc.Document.QueryInterface(IViewObject, ViewObject);
    if ViewObject <> nil then
    try
      DrawRect := Rect(0, 0, Result.Width, Result.Height);
      ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Form1.Handle,
        Result.Canvas.Handle, @DrawRect, nil, nil, 0);
    finally
      ViewObject._Release;
    end;
  end;
end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  IE: IWebbrowser2;
  targetBitmap: TBitmap;
begin
  IE := Webbrowser1.DefaultInterface as IWebBrowser2;
  targetBitmap := GetIEBitmap(IE);
  try
    ImgPreview.Picture.Bitmap.Assign(targetBitmap);
  finally
    targetBitmap.Free;
  end;
end;

toms 18. Mai 2006 07:21

Re: Webbrowser Screenshot
 
Nachtrag: ViewObject._Release; habe ich nun weggelassen aber der Screenshot bleibt weiss..

Mystic 18. Mai 2006 07:59

Re: Webbrowser Screenshot
 
COM-Interfaces werden glaube ich automatisch freigegeben und müssen nicht selbst freigegeben werden.

Bernhard Geyer 18. Mai 2006 08:04

Re: Webbrowser Screenshot
 
Zitat:

Zitat von Mystic
COM-Interfaces werden glaube ich automatisch freigegeben und müssen nicht selbst freigegeben werden.

I.d.R. ja. Aber bei IE < 7 muss man ab und zu _Release aufrufen damit keine Speicherleichen übrig bleiben.
Aber das muss man selbst ausprobieren bei welchen aktionen das nötig ist.
Zitat:

Zitat von toms
Nachtrag: ViewObject._Release; habe ich nun weggelassen aber der Screenshot bleibt weiss..

Probier mal folgenden Code

Mystic 18. Mai 2006 08:08

Re: Webbrowser Screenshot
 
Wahrscheinlich musst du DrawRect noch initialisieren.

marabu 18. Mai 2006 10:08

Re: Webbrowser Screenshot
 
Hallo Thomas.

DrawRect ist initialisiert - allerdings um ein Pixel zu groß. Das Form1.Handle wird ignoriert, weil der Parameter vorher auf nil gesetzt ist. Wird der LIndex = 1 (zweiter Parameter) überhaupt unterstützt?

Delphi-Quellcode:
if ViewObject <> nil then
begin
  DrawRect := Rect(0, 0, Pred(Result.Width), Pred(Result.Height));
  hr := ViewObject.Draw(DVASPECT_CONTENT, -1, nil, nil, 0,
    Result.Canvas.Handle, @DrawRect, nil, nil, 0);
  ViewObject := nil;
  ShowMessage(IntToHex(hr));
end;
Es passiert was du schon beschrieben hast - sobald auf ein "externes" Browser-Fenster zugegriffen wird, scheitert die Bildübernahme. Den Fehler-Code kenne ich nicht.

Grüße vom marabu

toms 18. Mai 2006 11:23

Re: Webbrowser Screenshot
 
Zitat:

Zitat von marabu
Es passiert was du schon beschrieben hast - sobald auf ein "externes" Browser-Fenster zugegriffen wird, scheitert die Bildübernahme. Den Fehler-Code kenne ich nicht.

Hallo marabu,

Der Fehler lautet:

---------------------------
Debugger Exception Notification
---------------------------
Project xyz.. raised exception class EOSError with message 'System Error. Code: 14000.
Der angeforderte Abschnitt war im Aktivierunskontext nicht vorhanden'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

marabu 18. Mai 2006 11:41

Re: Webbrowser Screenshot
 
Mit LIndex = 1 wird bei mir der Fehler-Code $800703F0 geliefert - der sagt mir aber auch nichts.

marabu

TKC 18. Mai 2006 16:32

Re: Webbrowser Screenshot
 
Ok.. hab jetz gefunden warum es nicht geht.

In der MSDN steht:
Zitat:

Like the IViewObject interface, IViewObject2 cannot be marshaled to another process. This is because device contexts are only effective in the context of one process.
MSDN Link dazu

toms 18. Mai 2006 17:02

Re: Webbrowser Screenshot
 
Danke ACE-ppc!

Gibt's denn eine andere Moeglichkeit?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz