Jump to content

HOWTO: DVBViewer Entwicklung in C++


Recommended Posts

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

Link to comment

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:

 

 

post-2941-0-89780900-1341818643_thumb.png

 

erwin

Link to comment

@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 ();

Link to comment

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:

 

:iiam:

Das mystische InitPlugin2 Interface in C++

Part 1

 

coming soon

 

erwin

Link to comment

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.

Link to comment

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

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...