<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung)]]></title><description><![CDATA[<p>Hi Community</p>
<p>Ich entwickle zur Zeit einen PluginManager der Plugins in DLL bzw in SO Form laden kann.</p>
<p>Das Plugin selbst enthält eine unbestimmte, vom Pluginentwickler zu definierende, Anzahl an Klassen welche über eine Factory im Pluginmanager instanziert werden.</p>
<p>Zum eigentlichen Problem: Ich raufe mir die Haare auf der Suche nach einer Lösung für die Identifikation von Plugin-Klassen.</p>
<p>Folgender Ablauf schwebt mir vor:<br />
<strong>1.</strong> PluginManager schaut in sein Verzeichniss und listet alle *.dll oder *.so<br />
<strong>2.</strong> PluginManager linkt (dynamisch) die erste DLL / SO in seiner Liste und fürht eine Identifikation durch (Schnittstellen Funktionalität)<br />
<strong>3.</strong> PluginManager sollte nun vom Plugin ein DING erhalten, welches das Plugin beschreibt (Momentan ist das ein struct mit den Variablen name und typ, dieses struct ist im Plugin hart codiert.)<br />
<strong>4.</strong> Zusätzlich dazu muss sich jede Klasse die der Pluginentwickler im Plugin implementiert hat, mit einem DING ausweisen können (ebenfalls mit name, typ usw) jedoch sollte keine Instanz der Klasse für den Vorgang nötig sein.<br />
<strong>5.</strong> Der Pluginmanager sollte am ende dieser &quot;Loading Plugins&quot; routine eine Liste mit allen Plugin namen,typen,usw haben und zusätzlich dazu eine list mit allen objekten die er aus diesen Plugins erzeugen kann (im Prinzip eine Liste mit Funkionspointern auf die Konstruktoren.</p>
<p>Die Factory übernimmt nun das Instanzieren.</p>
<p>Okay, eine Möglichkeit wäre die Verwendung einer PluginInfo Klasse, welche alle PluginInfos plus eine Liste (std::list) mit allen Klassen im Plugin speichert und einen Pointer auf dieses Object an den Pluginmanager übergibt.</p>
<p>Nachteil: Ich müsste eine Plugin Init Routine schreiben welche diese Liste bei benutzung des Plugins erzeugt ( std::list.push_back(&quot;name&quot;); usw...).</p>
<p>Ich möchte die Sache gerne Simpel lösen und auch dem Plugin Entwickler das Leben leichter machen. Es soll möglichst nicht an einer Stelle seine Klasse definieren müssen un an einer völlig anderen Stelle eine Referenz zu dieser Klasse in einen Liste eintragen müssen.</p>
<p>Habe bereits an structs, bzw an eine verkettete Liste von Structs gedacht, jedoch ist das ohne Object nicht wirklich zu realisieren das sich die structs untereinander nicht kennen.</p>
<p>Ich bitte um ein Tatkräftioges Brainstorming, da mein eigenes Brain momentan sehr ausgelaugt ist.</p>
<p>Vielen Dank</p>
<p>Grüße Bloop</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198447/idden-für-plugin-handling-gesucht-identifizierung-von-pluginmodulen-vor-der-instanzierung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 05:57:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198447.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Nov 2007 16:26:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung) on Wed, 21 Nov 2007 16:26:07 GMT]]></title><description><![CDATA[<p>Hi Community</p>
<p>Ich entwickle zur Zeit einen PluginManager der Plugins in DLL bzw in SO Form laden kann.</p>
<p>Das Plugin selbst enthält eine unbestimmte, vom Pluginentwickler zu definierende, Anzahl an Klassen welche über eine Factory im Pluginmanager instanziert werden.</p>
<p>Zum eigentlichen Problem: Ich raufe mir die Haare auf der Suche nach einer Lösung für die Identifikation von Plugin-Klassen.</p>
<p>Folgender Ablauf schwebt mir vor:<br />
<strong>1.</strong> PluginManager schaut in sein Verzeichniss und listet alle *.dll oder *.so<br />
<strong>2.</strong> PluginManager linkt (dynamisch) die erste DLL / SO in seiner Liste und fürht eine Identifikation durch (Schnittstellen Funktionalität)<br />
<strong>3.</strong> PluginManager sollte nun vom Plugin ein DING erhalten, welches das Plugin beschreibt (Momentan ist das ein struct mit den Variablen name und typ, dieses struct ist im Plugin hart codiert.)<br />
<strong>4.</strong> Zusätzlich dazu muss sich jede Klasse die der Pluginentwickler im Plugin implementiert hat, mit einem DING ausweisen können (ebenfalls mit name, typ usw) jedoch sollte keine Instanz der Klasse für den Vorgang nötig sein.<br />
<strong>5.</strong> Der Pluginmanager sollte am ende dieser &quot;Loading Plugins&quot; routine eine Liste mit allen Plugin namen,typen,usw haben und zusätzlich dazu eine list mit allen objekten die er aus diesen Plugins erzeugen kann (im Prinzip eine Liste mit Funkionspointern auf die Konstruktoren.</p>
<p>Die Factory übernimmt nun das Instanzieren.</p>
<p>Okay, eine Möglichkeit wäre die Verwendung einer PluginInfo Klasse, welche alle PluginInfos plus eine Liste (std::list) mit allen Klassen im Plugin speichert und einen Pointer auf dieses Object an den Pluginmanager übergibt.</p>
<p>Nachteil: Ich müsste eine Plugin Init Routine schreiben welche diese Liste bei benutzung des Plugins erzeugt ( std::list.push_back(&quot;name&quot;); usw...).</p>
<p>Ich möchte die Sache gerne Simpel lösen und auch dem Plugin Entwickler das Leben leichter machen. Es soll möglichst nicht an einer Stelle seine Klasse definieren müssen un an einer völlig anderen Stelle eine Referenz zu dieser Klasse in einen Liste eintragen müssen.</p>
<p>Habe bereits an structs, bzw an eine verkettete Liste von Structs gedacht, jedoch ist das ohne Object nicht wirklich zu realisieren das sich die structs untereinander nicht kennen.</p>
<p>Ich bitte um ein Tatkräftioges Brainstorming, da mein eigenes Brain momentan sehr ausgelaugt ist.</p>
<p>Vielen Dank</p>
<p>Grüße Bloop</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1407516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407516</guid><dc:creator><![CDATA[Bloop]]></dc:creator><pubDate>Wed, 21 Nov 2007 16:26:07 GMT</pubDate></item><item><title><![CDATA[Reply to Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung) on Wed, 21 Nov 2007 16:57:41 GMT]]></title><description><![CDATA[<p>Ich sag mal so... Wenn dus unter Windows machen willst, finde ich, bietet sich COM an, des erfüllt genau die Sachen, die du willst (im Großen und Ganzen) und du musst genau ein Interface definieren, an welches sich dann alle Plugin-Entwickler halten müssen, dass du die entsprechenden Objekte instanziieren kannst. Finde das unter Windows auch ganz gut so weit, ist halt ein nicht sehr plattformunabhängiges Konzept.<br />
Aber andererseits denke ich mir an deiner Stelle: Nagel doch die Plugin-Entwickler fest, die sollen sich zumindest an diverse Grundvorgaben von dir halten. Wenn du versuchst den Entwicklern den unendlichen Freiraum zu schaffen, dann kriegst du im Nachhinein nur Probleme, da du dich mit allen möglichen Eigenheiten der Entwickler rum schlagen musst, definiere einheitliche Schnittstellen und gut is, mach Vorgaben, dann wirds umso leichter und besser zu benutzen (von beiden Seiten eigentlich)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1407553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407553</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Wed, 21 Nov 2007 16:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung) on Wed, 21 Nov 2007 18:25:26 GMT]]></title><description><![CDATA[<p>Dies ist zwar eigentlich das Konzept für Games aber kannst ja mal probieren<br />
Ich machs immer mit folgenden Funktionen in der PlugIn-Dll</p>
<p>Init() -&gt; initialisiert Variablen, die von den Funktionen der Dll benötigt werden</p>
<p>Setup(Pointer auf &quot;Haupt-Klasse des Programmes oder spezielle PlugIn-Daten&quot;)<br />
-&gt; Verändert die Daten der Haupt-Klasse um beispielsweise einen neuen Menüeintrag zu erstellen</p>
<p>Info(&quot;Pointer auf auszufüllende Informationsstruktur&quot;) -&gt; Eine Struktur die Daten wie Autor, Version, etc. ausfüllt an denen das Programm prüft ob es Setup ausführt oder nicht</p>
<p>Exit() -&gt; PlugIn herunterfahren um beispielsweise Speicher frei zu geben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1407623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407623</guid><dc:creator><![CDATA[OTTO]]></dc:creator><pubDate>Wed, 21 Nov 2007 18:25:26 GMT</pubDate></item><item><title><![CDATA[Reply to Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung) on Wed, 21 Nov 2007 21:50:55 GMT]]></title><description><![CDATA[<p>Ich hätte noch eine Lösung, die aber nur unter Umständen etwas für dich wäre: Wenn es bei den Plugins nicht auf Geschwindigkeit ankommt, könntest du die Einbeziehung einer Script-Sprache bedenken. Gerade für Plugin-Funktionalität finde ich das Prima. Es ist gar nicht so schwer zu implementieren, es ist von Natur aus Open-Source (jeder kann bestehende Plugins kinderleicht erweitern oder draus lernen) und Plattform-unabhängig. Dort müsstest du halt auch bestimmte Vorgaben machen. Bei meinem Projekt an der Arbeit z.B. schreibt der Endbenutzer auch kleine Scripte, die dann dynamisch geladen werden. Einige Variablen müssen definiert und drei Funktionen vorhanden sein.</p>
<p>Hier mal ein Beispiel für ein Python-\1:</p>
<pre><code># Plugin-name
__name = &quot;Plugin nr 7&quot;
__author = &quot;Badestrand&quot;
__version = &quot;1.2.3&quot;

# Database and table to use
__dbserver = &quot;localhost&quot;
__user = &quot;root&quot;
__password = &quot;Geheim&quot;
__database = &quot;mydb&quot;

#intialization-routine
def Initialize( options ):
    options.fahr_zur_hoelle = true
    options.jesus_lebt = false

def DoSomethingFunny( mekka ):
    mekka.TravelTo()
    mekka.Pray()

def End():
    &quot;sad&quot;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1407793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407793</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 21 Nov 2007 21:50:55 GMT</pubDate></item><item><title><![CDATA[Reply to Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung) on Thu, 22 Nov 2007 00:09:16 GMT]]></title><description><![CDATA[<p>Mal nur so eine Idee:</p>
<pre><code class="language-cpp">// Header (gemeinsam für alle Plugins)
class Plugin
{
public:
    virtual ~Plugin()=0;
    // ...
};

struct PluginDllInfo
{
    char const* Name;
    // ...
};

struct PluginInfo
{
    char const* Name;
    int Type;
    // ...
    Plugin* (*Create)();
};

MY_DLL_EXPORT PluginDllInfo const* GetDllInfo();
MY_DLL_EXPORT PluginInfo const* const* GetPluginInfoArray();
</code></pre>
<pre><code class="language-cpp">MY_DLL_EXPORT PluginDllInfo const* GetDllInfo()
{
    static PluginDllInfo i = { &quot;sepp&quot;, ... };
    return sepp;
}

class FooPlugin : public Plugin
{
public:
    FooPlugin() { ... }
    virtual ~FooPlugin() {}

    // ...
};

Plugin* CreateFooPlugin()
{
    return new FooPlugin;
}

class BarPlugin : public Plugin
{
public:
    BarPlugin() { ... }
    virtual ~BarPlugin() {}

    // ...
};

Plugin* CreateBarPlugin()
{
    return new BarPlugin;
}

MY_DLL_EXPORT PluginInfo const* const* GetPluginInfoArray()
{
    static PluginInfo FooInfo = { &quot;foo&quot;, ... , CreateFooPlugin };
    static PluginInfo BarInfo = { &quot;bar&quot;, ... , CreateBarPlugin };
    static PluginInfo* i[] = {&amp;FooInfo, &amp;BarInfo, 0};
    return i;
}
</code></pre>
<p>Das wäre simpel.<br />
WinAmp DSP Plugins sind so ähnlich aufgebaut. Guck dir die Doku dazu an, ist recht einfach.</p>
<p>----</p>
<p>Du könntest aber genausogut eine vollständige &quot;PluginDllInfo&quot; Klasse basteln, die dann Funktionen zum Enumerieren der einzelnen Plugin Factory Klassen hat (eine Factory Klasse entspricht dabei dann einem PluginInfo, nur halt in &quot;schönerem Gewand&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1407864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407864</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 22 Nov 2007 00:09:16 GMT</pubDate></item><item><title><![CDATA[Reply to Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung) on Thu, 22 Nov 2007 08:51:59 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>und Danke für eure Antworten.</p>
<p>COM ist nicht möglich da ich ANSI C++ verwende um Platformunabhängig zu sein.<br />
Die Plugin Init() Funktion hab ich mir aich schon überlegt, das löst aber nicht das Problem der &quot;unbestimmten Menge an Klassen&quot;.<br />
Skriptsprache scheidet aus weil ich mitunter recht komplexe Dinge mit meinen Plugins machen muss.</p>
<p>Hustbear, deine Lösung deckt sich (erschreckender Weise inklusive der Klassenhierarchie) mit meiner Idee.</p>
<p>Als führt kein Weg drum herum alle PluginInfos an einer Stelle Hart zu codieren.</p>
<p>Vielen Dank euch allen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1407947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407947</guid><dc:creator><![CDATA[Bloop]]></dc:creator><pubDate>Thu, 22 Nov 2007 08:51:59 GMT</pubDate></item><item><title><![CDATA[Reply to Idden für Plugin Handling gesucht (Identifizierung von Pluginmodulen vor der Instanzierung) on Thu, 22 Nov 2007 11:42:57 GMT]]></title><description><![CDATA[<p>Ich hab sowas mal über eine abstrakte Factory gelöst:<br />
- Laden Plugin<br />
- Plugin kennt seine Factories, gegistrieret diese beim Laderprozess des Plugins<br />
- Factoryliste wird im Laderprozess an Resourcenmanager registriert und dort werden nun alle Instanzen per Namen / TypeID / Typ generiert.<br />
Die Registrierung sorgt dafür, dass die IDs und dergleichen zur Laufzeit bestimmt werden. Da jedes Plugin ebenfalls auf diesen Pluginmechanismus zurückgreifen kann, ist das Ganze recht flexibel in der Anwendung.</p>
<p>MfG Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408065</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Thu, 22 Nov 2007 11:42:57 GMT</pubDate></item></channel></rss>