Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IHTMLDocument2 implementieren (https://www.delphipraxis.net/54239-ihtmldocument2-implementieren.html)

Bernhard Geyer 30. Sep 2005 11:46


IHTMLDocument2 implementieren
 
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?

shmia 30. Sep 2005 12:24

Re: IHTMLDocument2 implementieren
 
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.

Bernhard Geyer 30. Sep 2005 12:51

Re: IHTMLDocument2 implementieren
 
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;

marabu 30. Sep 2005 13:17

Re: IHTMLDocument2 implementieren
 
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

shmia 30. Sep 2005 13:36

Re: IHTMLDocument2 implementieren
 
Zitat:

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)

Bernhard Geyer 30. Sep 2005 13:51

Re: IHTMLDocument2 implementieren
 
Zitat:

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.

Bernhard Geyer 30. Sep 2005 14:36

Re: IHTMLDocument2 implementieren
 
Zitat:

Zitat von shmia
Zitat:

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 :gruebel:

marabu 30. Sep 2005 18:53

Re: IHTMLDocument2 implementieren
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 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