![]() |
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? |
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 ![]() wie man eine VMT "zusammenbasteln" kann. |
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; |
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 |
Re: IHTMLDocument2 implementieren
Zitat:
Alles, was von TComponent abgeleitet wird, hat potentiell schon das Interface IUnknown. Das Interface IHTMLDocument2 wird ja über QueryInterface abgerufen:
Delphi-Quellcode:
Du könntest mal versuchen, bei //* ein Breakpoint zu setzen und nachzuschauen, welche IID abgefragt wird. (mit Debug- DCU's kompilieren)
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; |
Re: IHTMLDocument2 implementieren
Zitat:
|
Re: IHTMLDocument2 implementieren
Zitat:
Was könnte ich noch tun :gruebel: |
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:10 Uhr. |
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