<?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[Plugin-System: über DLLs, LIBs und Klassen(-instanzen)]]></title><description><![CDATA[<p>Hallo...<br />
Beim erstellen eines Plugin-Systems sind mir verschiedene Probleme aufgefallen, die ich bisher nicht so recht lösen konnte.</p>
<p><strong>Stand der Dinge</strong><br />
Das Projekt ist ein Serverplugin für Counter-Strike: Source. Das Serverplugin selber (ab nun Projekt) soll verschiedene Klassen und Interfaces zur Verfügung stellen, zu einem einfachen Zweck: Das Projekt soll es ermöglichen, schnell und einfach Addons für das Projekt zu entwickeln, welche dann wiederum auf das Spiel zugreifen. Das heißt, es gibt folgende Abfolge (Beispiel): <code>Spiel meldet Event -&gt; Projekt registriert dies -&gt; Projekt leitet Event an alle Addons weiter</code> . Ich möchte es den Addonautoren so einfach wie möglich machen, deshalb soll das ganze auch gut geplant sein. Am besten wäre es, wenn die Autoren &quot;nur noch&quot; die <code>Projekt.hpp</code> einbinden müssen, um dann problemlos Addons zu erstellen.</p>
<p><strong>Was ich nun realisieren möchte</strong><br />
Ich möchte realisieren, dass die Addonautoren <strong>keine</strong> eigenen Implementationen schreiben müssen. Das heißt, dass das Projekt alle Implementationen bereitstellt und nur noch die Headerdatei(en) an die Addonautoren weitergeben soll. Ich habe das bereits versucht, und <a href="http://www.codeproject.com/KB/DLL/PluginSystem.aspx" rel="nofollow">diesen</a> Artikel gefunden, so richtig weiterhelfen tut er mir aber dennoch nicht.</p>
<p><strong>Was möglich sein sollte - Szenario 1</strong><br />
Der Addonautor inkludiert <code>Projekt.hpp</code> und sollte mit kürzestem Code bereits erfolge erzielen. Beispiel:</p>
<pre><code class="language-cpp">#include &quot;Projekt.hpp&quot;

PROJEKT_PUBLISH_ADDON(Addon);
// mögliche Implementierung dieses Makros könnte ungefähr so aussehen:
// Addon AddonInstance();
// extern &quot;C&quot; __declspec(dllexport) IAddon *GetAddonInstance()
// {
//     return &amp;AddonInstance;
// }
// IProjekt *NL = NULL;
// extern &quot;C&quot; __declspec(dllexport) void SetAddonInstance(IProjekt *pNL)
// {
//     NL = pNL;
// }

class Addon : public IAddon
{
public:
    virtual void OnLoad()
    {
        NL-&gt;Output-&gt;ConsolePrint(&quot;Addon geladen!&quot;);
    }
    virtual void OnUnload()
    {
        NL-&gt;Output-&gt;ConsolePrint(&quot;Good bye!&quot;);
    }
};
</code></pre>
<p><code>NL</code> ist vom Typ <code>IProjekt</code> . Die Instanz von <code>IProjekt</code> soll nun alle möglichen Subklassen beinhalten. <code>IProjekt</code> könnte so aussehen:</p>
<pre><code class="language-cpp">class IProjekt
{
public:
    IProjekt() // Diese Funktion soll nur einmal (vom Projekt selber) aufgerufen werden, am besten sollten die Addonautoren die Implementation nicht zu Gesicht bekommen
    {
        this-&gt;Output = new Output;
        //this-&gt;... = new ...;
    }
    IOutput *Output;
    //I... *...;
};
</code></pre>
<p><strong>Zur Frage:</strong> Wie muss ich das ganze machen, damit das auch so funktioniert?</p>
<p><strong>Was möglich sein sollte - Szenario 2</strong><br />
Es sollte außerdem möglich sein, eigene Instanzen von Klassen zu erstellen (im Addon). Beispiel:</p>
<pre><code class="language-cpp">class Addon : public IAddon
{
public:
    // von oben
    virtual void OnTick()
    {
        IPlayer *Player = NL-&gt;Players-&gt;FindByUserID(6);
        IUserMessage UserMessage();
        UserMessage.WriteByte(0);
        UserMessage.WriteString(&quot;bla&quot;);
        Player-&gt;SendUserMessage(UserMessage);
        // Signatur von SendUserMessage:
        // virtual void SendUserMessage(const IUserMessage &amp;UserMessage);
    }
};
</code></pre>
<p>Wie genau kriege ich es nun hin, dass die Addonautoren auch Instanzen von IUserMessage erstellen können, <strong>ohne</strong> dass diese die Implementation machen müssen (sie sollen also nur die Headerdateien bekommen)?<br />
Eine weitere Frage: Ist es so sinnvoll, oder wäre es designtechnisch besser, wenn man <code>IUserMessage::Send(const IPlayer &amp;Player)</code> aufruft?</p>
<p>Bin echt dankbar für jegliche Art von Hilfe!<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264751/plugin-system-über-dlls-libs-und-klassen-instanzen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 10:23:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264751.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Apr 2010 12:09:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Plugin-System: über DLLs, LIBs und Klassen(-instanzen) on Mon, 12 Apr 2010 12:15:02 GMT]]></title><description><![CDATA[<p>Hallo...<br />
Beim erstellen eines Plugin-Systems sind mir verschiedene Probleme aufgefallen, die ich bisher nicht so recht lösen konnte.</p>
<p><strong>Stand der Dinge</strong><br />
Das Projekt ist ein Serverplugin für Counter-Strike: Source. Das Serverplugin selber (ab nun Projekt) soll verschiedene Klassen und Interfaces zur Verfügung stellen, zu einem einfachen Zweck: Das Projekt soll es ermöglichen, schnell und einfach Addons für das Projekt zu entwickeln, welche dann wiederum auf das Spiel zugreifen. Das heißt, es gibt folgende Abfolge (Beispiel): <code>Spiel meldet Event -&gt; Projekt registriert dies -&gt; Projekt leitet Event an alle Addons weiter</code> . Ich möchte es den Addonautoren so einfach wie möglich machen, deshalb soll das ganze auch gut geplant sein. Am besten wäre es, wenn die Autoren &quot;nur noch&quot; die <code>Projekt.hpp</code> einbinden müssen, um dann problemlos Addons zu erstellen.</p>
<p><strong>Was ich nun realisieren möchte</strong><br />
Ich möchte realisieren, dass die Addonautoren <strong>keine</strong> eigenen Implementationen schreiben müssen. Das heißt, dass das Projekt alle Implementationen bereitstellt und nur noch die Headerdatei(en) an die Addonautoren weitergeben soll. Ich habe das bereits versucht, und <a href="http://www.codeproject.com/KB/DLL/PluginSystem.aspx" rel="nofollow">diesen</a> Artikel gefunden, so richtig weiterhelfen tut er mir aber dennoch nicht.</p>
<p><strong>Was möglich sein sollte - Szenario 1</strong><br />
Der Addonautor inkludiert <code>Projekt.hpp</code> und sollte mit kürzestem Code bereits erfolge erzielen. Beispiel:</p>
<pre><code class="language-cpp">#include &quot;Projekt.hpp&quot;

PROJEKT_PUBLISH_ADDON(Addon);
// mögliche Implementierung dieses Makros könnte ungefähr so aussehen:
// Addon AddonInstance();
// extern &quot;C&quot; __declspec(dllexport) IAddon *GetAddonInstance()
// {
//     return &amp;AddonInstance;
// }
// IProjekt *NL = NULL;
// extern &quot;C&quot; __declspec(dllexport) void SetAddonInstance(IProjekt *pNL)
// {
//     NL = pNL;
// }

class Addon : public IAddon
{
public:
    virtual void OnLoad()
    {
        NL-&gt;Output-&gt;ConsolePrint(&quot;Addon geladen!&quot;);
    }
    virtual void OnUnload()
    {
        NL-&gt;Output-&gt;ConsolePrint(&quot;Good bye!&quot;);
    }
};
</code></pre>
<p><code>NL</code> ist vom Typ <code>IProjekt</code> . Die Instanz von <code>IProjekt</code> soll nun alle möglichen Subklassen beinhalten. <code>IProjekt</code> könnte so aussehen:</p>
<pre><code class="language-cpp">class IProjekt
{
public:
    IProjekt() // Diese Funktion soll nur einmal (vom Projekt selber) aufgerufen werden, am besten sollten die Addonautoren die Implementation nicht zu Gesicht bekommen
    {
        this-&gt;Output = new Output;
        //this-&gt;... = new ...;
    }
    IOutput *Output;
    //I... *...;
};
</code></pre>
<p><strong>Zur Frage:</strong> Wie muss ich das ganze machen, damit das auch so funktioniert?</p>
<p><strong>Was möglich sein sollte - Szenario 2</strong><br />
Es sollte außerdem möglich sein, eigene Instanzen von Klassen zu erstellen (im Addon). Beispiel:</p>
<pre><code class="language-cpp">class Addon : public IAddon
{
public:
    // von oben
    virtual void OnTick()
    {
        IPlayer *Player = NL-&gt;Players-&gt;FindByUserID(6);
        IUserMessage UserMessage();
        UserMessage.WriteByte(0);
        UserMessage.WriteString(&quot;bla&quot;);
        Player-&gt;SendUserMessage(UserMessage);
        // Signatur von SendUserMessage:
        // virtual void SendUserMessage(const IUserMessage &amp;UserMessage);
    }
};
</code></pre>
<p>Wie genau kriege ich es nun hin, dass die Addonautoren auch Instanzen von IUserMessage erstellen können, <strong>ohne</strong> dass diese die Implementation machen müssen (sie sollen also nur die Headerdateien bekommen)?<br />
Eine weitere Frage: Ist es so sinnvoll, oder wäre es designtechnisch besser, wenn man <code>IUserMessage::Send(const IPlayer &amp;Player)</code> aufruft?</p>
<p>Bin echt dankbar für jegliche Art von Hilfe!<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1881535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1881535</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 12 Apr 2010 12:15:02 GMT</pubDate></item></channel></rss>