AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Webbrowser Screenshot

Ein Thema von toms · begonnen am 18. Mai 2006 · letzter Beitrag vom 25. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#1

Webbrowser Screenshot

  Alt 18. Mai 2006, 08:20
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;
Miniaturansicht angehängter Grafiken
error_201.jpg  
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 08:21
Nachtrag: ViewObject._Release; habe ich nun weggelassen aber der Screenshot bleibt weiss..
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 08:59
COM-Interfaces werden glaube ich automatisch freigegeben und müssen nicht selbst freigegeben werden.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 09:04
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 von toms:
Nachtrag: ViewObject._Release; habe ich nun weggelassen aber der Screenshot bleibt weiss..
Probier mal folgenden Code
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 09:08
Wahrscheinlich musst du DrawRect noch initialisieren.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 11:08
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 12:23
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
---------------------------
Thomas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 12:41
Mit LIndex = 1 wird bei mir der Fehler-Code $800703F0 geliefert - der sagt mir aber auch nichts.

marabu
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#9

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 17:32
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#10

Re: Webbrowser Screenshot

  Alt 18. Mai 2006, 18:02
Danke ACE-ppc!

Gibt's denn eine andere Moeglichkeit?
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:28 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