dbraner Posted July 8, 2012 Share Posted July 8, 2012 Hallo, die Entwicklung von Erweiterungen und Plugins für den DVBViewer beschäftigt mich schon geraume Zeit und ich weiß nicht, wie viele Stunden ich mit der Suche nach Informationen und v.a. Fehlern in meinen Programm-Versuchen verbracht habe. Damit nicht jeder das Rad neu erfinden muss, habe ich meine Erkenntnisse (und auch die vieler anderer Forenmitglieder) in beiliegendem PDF zusammengefasst. Das Beispielprogramm DVBVCTest zeigt die Verwendung des COM-Interfaces sowie die Event-Behandlung mit C++. Bei DVBVCPlugin handelt es sich um ein einfaches Beispiel für ein Plugin. Ich hoffe damit möglichst viele C++ Entwickler in diesem Forum motivieren zu können, Ihre Bemühungen nicht einzustellen und v.a. nicht zu resignieren, wenn es mal irgendwo hakt. Ggf. werde ich das Dokument noch erweitern. Auf der Liste stehen z.B. OSD-Plugins (echt übel). EDIT: Am OSD-Plugin Thema ist erwin dran. Siehe Das mystische InitPlugin2 Interface DVBViewer_CPP.pdf DVBVCTest.zip DVBV-Plugin.zip Quote Link to comment
erwin Posted July 9, 2012 Share Posted July 9, 2012 Meine Vorschläge: 4.1 Allgemeines zu Plugins * Programm-Plugins * Input-Plugins * Import-Plugins * OSD-Plugins wird zu * Programm-Plugins * Input-Plugins * Import-Plugins * OSD-Plugins und Optionen-Plugins 4.2 Exportierte Funktionen zusätzliche Spalte: "OSD&Optionen" zusätzliche Zeile: InitPlugin2, X bei "OSD&Optionen", Initialisierung eines OSD- oder Optionen-Plugins Hintergrund: Über den InitPlugin2-Aufruf seitends des DVBV kann man dem DVBV ein Interface zu einer Objekthierarchie bereitstellen die OSD bzw. Oprionenfunktionalität implementiert. Den Optionenteil habe ich bereits portiert. Sieht dann in der Anwendung z.B so aus: erwin Quote Link to comment
dbraner Posted July 9, 2012 Author Share Posted July 9, 2012 @erwin: war eigentlich so ähnlich geplant, wie Du vorschlägst. Ich habe das Thema OSD-Plugin bisher ausgeklammert, da ich es noch nicht zum Laufen gebracht habe. Die InitPlugin2() schmiert mir ab, sobald ich ein IDVBViewerPlugin Objekt zurück gebe. Hier wäre ein lauffähiges Beispiel, das die Basisfunktionen wie InitPlugin2, Init, Terminate usw. beinhaltet hilfreich. Irgendwo habe ich da noch einen Fehler in der Implementierung. Kann auch hier gerne mal meinen Arbeitsstand posten. Im Prinzip habe ich aber nichts anderes gemacht, als das Interface abgeleitet von IUnknown zu definieren inkl. der Funktionen AddRef, Release und QueryInterface. In InitPlugin2 lege ich dann ein Objekt dieser Klasse an und gebe es zurück. InitPlugin2 ist wie folgt deklariert: IDVBVewerPlugin * __stdcall InitPlugin2 (); Quote Link to comment
erwin Posted July 9, 2012 Share Posted July 9, 2012 In InitPlugin2 lege ich dann ein Objekt dieser Klasse an und gebe es zurück. InitPlugin2 ist wie folgt deklariert: IDVBVewerPlugin * __stdcall InitPlugin2 (); Die Crux ist, dass viele Funktionen in den Pascal-Quellen zwar als "stdcall" deklariert sind, aber in Wirklichkeit "safecall" sind. Mach es so: extern "C" void __stdcall InitPlugin2( IDVBViewerPlugin * * plugin ) { DebugOut( "DVBVCALL InitPlugin2" ); * plugin = ( TBaseDVBViewerPlugin * ) g_PluginOptions; } Wobei g_PluginOptions ein Pointer auf eine Instanz eines Typs ist der von TBaseDVBViewerPlugin als auch von IPlugin (wenn du ein Options-Plugin schreibst) oder von IOSDPlugin (wenn du ein reines OSD-Plugin schreibst) ableitet. Achtung: die Reihenfolge bei der Angabe der Parents dieser Mehrfachvererbung ist wesentlich. TBaseDVBViewerPlugin ist dabei eine Implementationsklasse des IDVBViewer Interfaces. Eine Erklärung dieser ganzen Zusammenhänge ist in Vorbereitung: Das mystische InitPlugin2 Interface in C++ Part 1 coming soon erwin Quote Link to comment
dbraner Posted July 10, 2012 Author Share Posted July 10, 2012 extern "C" void __stdcall InitPlugin2( IDVBViewerPlugin * * plugin ) { DebugOut( "DVBVCALL InitPlugin2" ); * plugin = ( TBaseDVBViewerPlugin * ) g_PluginOptions; } ok, InitPlugin2 läuft jetzt durch, danach wird aber nur einmal AddRef und Release meiner Pluginklasse aufgerufen, kein Init() usw. Liegt aber vielleicht daran, dass ich nur von IDVBViewerPlugin abgeleitet habe, nicht von IOSDPlugin. Ich warte mal auf Deine weiteren Veröffentlichungen zur mystischen OSD-Plugin Schnittstelle. Quote Link to comment
erwin Posted July 11, 2012 Share Posted July 11, 2012 Liegt aber vielleicht daran, dass ich nur von IDVBViewerPlugin abgeleitet habe, nicht von IOSDPlugin. Ich denke eher es ist ein Folgefehler von fehlerhafter Name() Implementation. Name() ist auch dem safecall-Fluch verfallen. Versuchs mal so: virtual HRESULT __stdcall Name( BSTR * name ){ return S_OK;}[/codeBOX] Aber weise BSTR * name nichts zu. Es ist hier nichts wie es scheint, sprich name steht für etwas ganz anderes (nämlich dem this-Pointer). Wahrscheinlich sind alle Methoden, welche lt. den Pascal-Quellen nicht HRESULT zurückgeben so umzuschreiben. Ausführlich dann im Part 2. erwin Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.