<?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[Singleton über DLL Grenzen verwenden]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade dabei, eine Singleton Logger-Klasse für mein Programm zu schreiben...<br />
Dabei würde ich gerne ein automatisches Exception Logging implementieren, so dass<br />
jede Exception einen Eintrag in der Log-Datei hinterlässt.<br />
Jetzt hab ich aber das Problem, dass Teile meines Programms in Plugin-DLLs ausgelagert sind. Das Werfen von Exceptions von dort ins Hauptprogramm funktioniert auch anstandslos, nur hab ich ja dann das Problem, dass ein Zugriff von innerhalb einer DLL auf ein Singletonobjekt eine zweite Instanz erzeugen würde...<br />
Kann mir jemand Vorschläge nennen, wie ich um das Problem möglichst sauber herumarbeiten kann?</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192117/singleton-über-dll-grenzen-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 21:33:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192117.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Sep 2007 17:49:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Mon, 10 Sep 2007 17:49:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade dabei, eine Singleton Logger-Klasse für mein Programm zu schreiben...<br />
Dabei würde ich gerne ein automatisches Exception Logging implementieren, so dass<br />
jede Exception einen Eintrag in der Log-Datei hinterlässt.<br />
Jetzt hab ich aber das Problem, dass Teile meines Programms in Plugin-DLLs ausgelagert sind. Das Werfen von Exceptions von dort ins Hauptprogramm funktioniert auch anstandslos, nur hab ich ja dann das Problem, dass ein Zugriff von innerhalb einer DLL auf ein Singletonobjekt eine zweite Instanz erzeugen würde...<br />
Kann mir jemand Vorschläge nennen, wie ich um das Problem möglichst sauber herumarbeiten kann?</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1362780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1362780</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Mon, 10 Sep 2007 17:49:09 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Mon, 10 Sep 2007 18:45:47 GMT]]></title><description><![CDATA[<p>Referenz auf den Singleton beim Initialisieren der DLL übergeben ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1362815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1362815</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Mon, 10 Sep 2007 18:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Mon, 10 Sep 2007 22:40:10 GMT]]></title><description><![CDATA[<p>Wo erzeugt was warum eine 2. Instanz?</p>
<p>Wenn die Logger-DLL z.B. eine GetLogger() Funktion hat, welche eine Referenz auf das Singleton zurückliefert, dann funktioniert das. Innerhalb eines Prozesses hast du dann immer nur eine Instanz des Singletons - vorausgesetzt dein Singleton funktioniert.</p>
<p>Verstehe das Problem nicht...</p>
<p>p.S.: falls der &quot;Logger&quot; noch nicht in seiner eigenen DLL lebt, dann lager den einfach in eine DLL aus. Dann kannst du das Hauptprogramm und die anderen DLLs gegen die Logger-DLL linken, und alles sollte gut sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1362899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1362899</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 10 Sep 2007 22:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Tue, 11 Sep 2007 07:22:22 GMT]]></title><description><![CDATA[<p>Hi,<br />
ein bisschen OT aber sollte man nicht dafür Sorge tragen, dass Exceptions nicht die DLL verlassen?</p>
<p>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363006</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Tue, 11 Sep 2007 07:22:22 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Tue, 11 Sep 2007 07:42:10 GMT]]></title><description><![CDATA[<p>die antwort ist: ja und nein.<br />
ja, weil man damit richtig spaß beim casten bekommen kann.<br />
nein, weil es ein sehr wichtiges hilfsmittel zur fehlerbehandlung ist.</p>
<p>in den meisten fällen, also immer wenn du nicht über dll-grenzen hinweg klassenhierachien aufbaust, was bei exceptions nun wahrlich recht ungewöhnlich ist, gibt es keinerlei probleme, daher kann man recht sorgenfrei exceptions über dll-grenzen hinweg werfen.</p>
<p>falls du interne exceptions meinst, so ist antwort definitv ja. man sollte die internen fehler in sinnvolle, eigene exceptions verpacken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363014</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Tue, 11 Sep 2007 07:42:10 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Tue, 11 Sep 2007 12:37:07 GMT]]></title><description><![CDATA[<p>Meine Programmstruktur ist leider etwas komplizierter...<br />
Das ganze soll eine rudimentäre 3D-Engine werden.<br />
Die eigentliche Engine-Funktionalität liegt momentan in einer statischen Bibliothek (soll später eine DLL werden). Beim Laden lädt die Engine eine Plugin-DLL, die eine Funktion &quot;CreateInstance&quot; exportiert, die ein abgeleitetes Objekt einer virtuellen Renderer-Basisklasse zurückgibt. Wenn also der Renderer einen Fehler feststellt, wird eine Exception zurück an die Engine geworfen, was, wie gesagt, auch funktioniert. Da der Renderer aber ja Zugriff auf die Mehoden der Engine-Objekte benötigt, muss ich die Plugin-DLL auch gegen die Engine-Bibliothek linken (ich hab irgendwie den Eindruck, dass ich irgendwann damit höllisch auf die Schnauze flieg <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ).<br />
Der Logger ist ein Objekt der Engine, aber der Renderer weiß ja nicht, dass die Engine selbst eine Instanz davon erzeugt, folglich würde der Renderer beim ersten Zugriff auf den Logger eine neue Instanz erzeugen, *Bumm*.<br />
Ich hab mich vorerst entschlossen, dem Logger eine &quot;InjectInstance&quot; Methode mitzugeben, die einen Zeiger auf den Instanzzeiger des orginalen Loggerobjekts erwartet, so dass die Klasse auch mit einem fremden Instanzzeiger arbeiten kann. Nur so kann ich gewährleisten, dass beide Module tatsächlich mit dem selben Objekt arbeiten...</p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363278</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Tue, 11 Sep 2007 12:37:07 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Wed, 12 Sep 2007 00:38:22 GMT]]></title><description><![CDATA[<p>Äh.<br />
Vorschlag: pack gleich alles in DLLs. Dann hast du jetzt das was du sowieso schon machen willst, und kein Problem mehr mit dem Logger. Verwende für alle DLLs und Programme den selben Compiler und überall die selbe Runtime DLL, und fertig.</p>
<p>Den Logger würde ich einfach als Singleton in der DLL beheimaten die den Logger implementiert. Dann kannst du jederzeit überall das Singleton verwenden indem die die Funktion der Logger-DLL verwendest eine Referenz darauf zu bekommen, und es wird immer der selbe Logger sein, egal wo du ihn anforderst.</p>
<p>Mit MSVC zumindest kannst du auch Exceptions wie du willst werfen und fangen, DLL Grenzen spielen dabei keine Rolle. Dasselbe gilt für RTTI und dynamische Speicherverwaltung. (Vorausgesetzt natürlich: gleiche MSVC Version, gleiche Runtime DLL - siehe oben)</p>
<p>Worüber man sich natürlich im Klaren sein muss ist dass gewisse Dinge beim Linken nichtmehr zusammengeführt werden wenn man LIBs gegen DLLs tauscht, wie z.B. statische Variablen bzw. &quot;class-statics&quot; in inline Code. Unter Linux funktioniert das AFAIK, unter Windows i.A. nicht (kann sein irgendein Compiler implementiert es, wäre mir aber nix bekannt, und sicher nicht MSVC).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363738</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 12 Sep 2007 00:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Wed, 12 Sep 2007 17:20:40 GMT]]></title><description><![CDATA[<p>Jo, danke, das funktioniert jetzt anstandslos.<br />
Aber kann ich mich auch darauf verlassen, dass statische Member von Klassen, die in einer DLL liegen immer an der gleichen Adresse liegen, wenn die DLL von zwei verschiedenen Modulen unabhängig eingebunden wird?</p>
<p>Danke,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364173</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Wed, 12 Sep 2007 17:20:40 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton über DLL Grenzen verwenden on Wed, 12 Sep 2007 17:28:40 GMT]]></title><description><![CDATA[<p>Wenn diese statischen Member nicht in inline Code definiert werden (der in anderen Modulen expandiert werden könnte), dann kannst du dir sicher sein dass sämtliche &quot;Module&quot; (DLLs) in einem Prozess die gleiche Adresse sehen werden, ja.<br />
Genauso wie ja auch die Adresse von Funktionen in DLLs für alle anderen DLLs gleichist.</p>
<p>Für unterschiedliche Prozesse gilt das natürlich nicht unbedingt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364175</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 12 Sep 2007 17:28:40 GMT</pubDate></item></channel></rss>