AGB  ·  Datenschutz  ·  Impressum  







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

IHTMLDocument2 implementieren

Ein Thema von Bernhard Geyer · begonnen am 30. Sep 2005 · letzter Beitrag vom 30. Sep 2005
Antwort Antwort
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#1

IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 11:46
Ich darf (muß) eine Komponenten verwenden, welche eine ActiveX-Schnittstelle verwendet welche nur dann vernünftig läuft, wenn der Hoster (meine Komponente) IHTMLDocument2 implementiert (hier sind vermutlich nur 1-2 Methoden relevant). Diese will ich auf Ebene meiner Kapslungs-Klasse (TPanel) implementieren.

Hat jemand schon sowas ähnliches gemacht und könnte mir 'ne Vorlage geben?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 12:24
Die Komponente wird wahrscheinlich frühe Bindung (also nicht die IDispatch) benützen.
Dann bist du gezwungen, alle Methoden zumindest als Stub zu implementieren.
Das sind schätzungsweise über 40 Methoden.
Da du nur 2 oder 3 brauchst, könnte man sich überlegen, ob man die VMT nicht irgendwie selbst konstruieren kann.
negaH scheint sich da auszukennen; er zeigt auf http://www.delphipraxis.net/internal...ct.php?p=52290
wie man eine VMT "zusammenbasteln" kann.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 12:51
Das mit den 40 Methoden wäre nicht das Problem.

Aber mir ist im Moment nicht klar was ich tun muß damit das ActiveX-Control mitbekommt das mein
TPanel dieses Interface implementiert. Reicht es aus das ich.

Delphi-Quellcode:
type
  TMyWrapper = class(TPanel, IHTML2Document)
  private
    FActiveXControl: TSpecialActiveX;
    ...
  public
    constructor Create(AOwner: TComponent); override;
    ...
  end;

constructor TMyWrapper.Create(AOwner: TComponent);
begin
  FActiveXControl := TSpecialActiveX.Create(self);
  // Weis FActiveXControl jetzt schon das ich IHTML2Document implementieren?
end;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
marabu

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

Re: IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 13:17
Hallo Bernhard,

ich würde den ActiveX-Experten von Delphi verwenden um eine activex-kompatible TPanel-Komponente zu erstellen. Ob der Konstruktor von SpecialActiveX schon versucht sich den Zeiger auf IHTMLDocument2 zu besorgen, wer weiß dass schon? Wenn eine Exception geworfen wird, dann wird er es wohl versucht haben. Warum packst du die Special-Komponente nicht einfach in den TWebBrowser und klebst den auf dein TPanel? Das spart dir sicher eine Menge Arbeit...

Grüße vom marabu
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 13:36
Zitat von Bernhard Geyer:
Aber mir ist im Moment nicht klar was ich tun muß damit das ActiveX-Control mitbekommt das mein
TPanel dieses Interface implementiert. Reicht es aus das ich.
Ja, das müsste eigentlich reichen.
Alles, was von TComponent abgeleitet wird, hat potentiell schon das Interface IUnknown.
Das Interface IHTMLDocument2 wird ja über QueryInterface abgerufen:
Delphi-Quellcode:
function TComponent.QueryInterface(const IID: TGUID; out Obj): HResult;
begin //*
  if FVCLComObject = nil then
  begin
    if GetInterface(IID, Obj) then Result := S_OK
    else Result := E_NOINTERFACE
  end
  else
    Result := IVCLComObject(FVCLComObject).QueryInterface(IID, Obj);
end;
Du könntest mal versuchen, bei //* ein Breakpoint zu setzen und nachzuschauen, welche IID abgefragt wird. (mit Debug- DCU's kompilieren)
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 13:51
Zitat von marabu:
Warum packst du die Special-Komponente nicht einfach in den TWebBrowser und klebst den auf dein TPanel? Das spart dir sicher eine Menge Arbeit...
Habe ich im Moment. Aber da gibt es jede Menge Timing-Probleme und nötige Workaround um diverse IE-Bugs und Bugs aufgrund der IE-Integration zu umschiffen. Aktuell gibt es noch 1-2 Timing-Probleme die ich evtl. nicht zuverlässig lösen kann. Ich bin mit IE-Hosting "zu weit" vom eigentlichen Control weg.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 14:36
Zitat von shmia:
Zitat von Bernhard Geyer:
Aber mir ist im Moment nicht klar was ich tun muß damit das ActiveX-Control mitbekommt das mein
TPanel dieses Interface implementiert. Reicht es aus das ich.
Ja, das müsste eigentlich reichen.
Reicht scheinbar nicht. QueryInterface wird nicht für mein Panel aufgerufen.
Was könnte ich noch tun
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
marabu

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

Re: IHTMLDocument2 implementieren

  Alt 30. Sep 2005, 18:53
Vielleicht erhältst du einen zuverlässigeren Hinweis darauf, dass dein PanelX von der Special-Komponente angefunkt wird, wenn du einen break point in deinem eigenen Code setzt - vorzugsweise in der Methode GetControlInterface.

marabu
  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 21:42 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