<?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[verständnisfrage bei dll&#x27;s]]></title><description><![CDATA[<p>hey leute,<br />
wie im Titel steht giebts da so eine kleine sache die ich nicht verstehe.<br />
eine dll wird doch damit man sie nutzen kann in den virtuellen adressraum des aufrufenden programms geladen, da ja sonst die adresse einer funktion aus der dll gar nicht gültig wäre, denn die adressräume sind ja voneinander abgeschottet.</p>
<p>Nun ist es ja aber möglich in einer dll ein datensegment als shared zu kennzeichnen, wodurch auch andere programme die die dll laden auf den wert zugreifen können, den ein anderes programm dort reingeschrieben hat. Wie ist das dann möglich? Eigentlich müsste die dll nach gebrauch ja wieder aus dem adressraum geworfen werden. Nun hab ich aber im petzold-buch gelesen, dass windows da einen referenzzähler hat, der das ganze verwaltet. Hoffe ihr versteht wie ich das meine. Bitte helft mir da mal auf die sprünge.</p>
<p>Grüsse<br />
player424</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243699/verständnisfrage-bei-dll-s</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 04:47:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243699.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Jun 2009 23:12:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to verständnisfrage bei dll&#x27;s on Fri, 19 Jun 2009 23:12:44 GMT]]></title><description><![CDATA[<p>hey leute,<br />
wie im Titel steht giebts da so eine kleine sache die ich nicht verstehe.<br />
eine dll wird doch damit man sie nutzen kann in den virtuellen adressraum des aufrufenden programms geladen, da ja sonst die adresse einer funktion aus der dll gar nicht gültig wäre, denn die adressräume sind ja voneinander abgeschottet.</p>
<p>Nun ist es ja aber möglich in einer dll ein datensegment als shared zu kennzeichnen, wodurch auch andere programme die die dll laden auf den wert zugreifen können, den ein anderes programm dort reingeschrieben hat. Wie ist das dann möglich? Eigentlich müsste die dll nach gebrauch ja wieder aus dem adressraum geworfen werden. Nun hab ich aber im petzold-buch gelesen, dass windows da einen referenzzähler hat, der das ganze verwaltet. Hoffe ihr versteht wie ich das meine. Bitte helft mir da mal auf die sprünge.</p>
<p>Grüsse<br />
player424</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729843</guid><dc:creator><![CDATA[player424]]></dc:creator><pubDate>Fri, 19 Jun 2009 23:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to verständnisfrage bei dll&#x27;s on Fri, 19 Jun 2009 23:39:07 GMT]]></title><description><![CDATA[<p>player424 schrieb:</p>
<blockquote>
<p>Nun ist es ja aber möglich in einer dll ein datensegment als shared zu kennzeichnen, wodurch auch andere programme die die dll laden auf den wert zugreifen können, den ein anderes programm dort reingeschrieben hat. Wie ist das dann möglich?</p>
</blockquote>
<p>Normalerweise erhält jede Instanz einer DLL wenn sie in einen Prozess reingeladen wird ihren eigenen privaten Satz der Daten. Bei einem Shared segment existiert halt nur ein einzelner Datensatz, der dann vom Betriebssystem in mehrere Prozesse in deren virtuellen Adressräume eingeblendet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729849</guid><dc:creator><![CDATA[DLLing]]></dc:creator><pubDate>Fri, 19 Jun 2009 23:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to verständnisfrage bei dll&#x27;s on Fri, 19 Jun 2009 23:43:26 GMT]]></title><description><![CDATA[<p>wie siehts denn mit den systembibliotheken aus? ich hab da gelesen das die erst aus dem speicher geworfen werden, wenn sie von keinem programm mehr genutzt werden. also mit diesem referenzzähler den ich erwähnt hatte.</p>
<p>P.S. schonmal vielen dank für die antwort</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729850</guid><dc:creator><![CDATA[player424]]></dc:creator><pubDate>Fri, 19 Jun 2009 23:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to verständnisfrage bei dll&#x27;s on Sat, 20 Jun 2009 01:17:45 GMT]]></title><description><![CDATA[<p>Ich verstehe ehrlich gesagt nicht ganz was du nicht verstehst. Du schreibst ja selbst schon wie es ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Windows kann eben DLLs &quot;sharen&quot;, also mehreren Prozessen gleichzeitig verfügbar machen. Damit das funktioniert, muss natürlich mitgezählt werden, wie viele Programme (Prozesse) diese DLL gerade verwenden.</p>
<p>Die meisten Teile einer DLL werden dabei so verwaltet, dass für jeden Prozess die gleiche &quot;Kopie&quot; der Speicherseiten verwendet wird, und erst wenn ein Prozess Änderungen an solchen Speicherseiten vornimmt, wird on-the-fly eine private Kopie für diesen Prozess angelegt. Das geht eben gerade weil ja jeder Prozess seinen eigenen Adressraum hat.</p>
<p>Windows hält dazu eine Kopie der unveränderten DLL Speicherseiten im Speicher, und zusätzlich pro Prozess der Änderungen vorgenommen hat eine weitere &quot;private&quot; Kopie. Die unveränderten werden dabei bei Bedarf direkt aus dem DLL-File geladen (wenn sie z.B. auf Grund von Speichermangel irgendwann aus dem Speicher geworfen wurden, oder gar noch nie geladen waren, weil noch kein Prozess sie gebraucht hat). Die modifizierten Speicherseiten werden bei Platzmangel ins Pagefile geschrieben, damit diese wieder 1:1 rekonstruiert werden können - sonst könnte ja ein Prozess &quot;seine&quot; Version verlieren - was natürlich nicht geht.</p>
<p>Die DLLs sind dabei so aufgebaut, dass der Bereich der üblicherweise modifiziert werden muss, sehr klein ist, auch wenn die DLL an einer &quot;unerwarteten&quot; Adresse in den Adressraum eines Prozesses eingeblendet werden muss, z.B. weil der &quot;vorgesehene&quot; Adressraum schon von was anderem verwendet wurde.</p>
<p>Die von dir erwähnten &quot;shared&quot; Segmente behandelt Windows dann einfach so, dass Änderungen an diesen Segmenten <em>nicht</em> dazu führen, dass eine &quot;private&quot; Kopie angelegt wird, sondern lediglich dazu, dass Windows die eine und einzige Kopie als &quot;geändert&quot; markiert, damit diese - falls nötig - ins Pagefile geschrieben wird, und nicht einfach verworfen, da sie ja dann nichtmehr 1:1 aus dem DLL File rekonstruiert werden können.</p>
<p>Wenn nun ein Prozess beendet wird, dann verschmeisst Windows sämtliche &quot;privaten&quot; Kopien von Speicherseiten die diesem Prozess &quot;gehören&quot;, und verringert den Reference-Count der DLL um eins. Wenn der Reference-Count auf Null geht, wird die ganze DLL verschmissen (entladen, freigegeben), inklusive der &quot;shared&quot; Segmente.</p>
<p>D.h. Programme (Prozesse) können &quot;shared&quot; Segmente nutzen um miteinander zu kommunizieren. Sobald aber der letzte Prozess beendet wird, der diese DLL verwendet, &quot;verfallen&quot; auch alle Änderungen die in &quot;shared&quot; Segmenten gemacht wurden. Und das nächste mal, wenn ein Prozess gestartet wird, der diese DLL verwendet, fängt alles quasi wieder bei Null an. Also als ob die DLL noch nie geladen gewesen wäre.</p>
<p>(Dabei spielt es übrigens keine Rolle ob Windows die &quot;rohen Speicherseiten&quot; der DLL noch im Cache behält. Sobald der letzte Prozess beendet wurde der eine solche DLL verwendet, ist garantiert, dass die DLL beim nächsten mal neu initialisiert wird, also auch &quot;shared&quot; Segmente wieder bei &quot;Null&quot; anfangen.)</p>
<p>----</p>
<p>Kannst du damit was anfangen? Oder ist das noch zu sehr &quot;technobabble&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729879</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Jun 2009 01:17:45 GMT</pubDate></item><item><title><![CDATA[Reply to verständnisfrage bei dll&#x27;s on Sat, 20 Jun 2009 13:10:18 GMT]]></title><description><![CDATA[<p>danke für die umfangreiche antwort hustbaer, nun hab ichs glaub ich verstanden. Also wird die dll nicht direkt in den adressraum geladen sondern zuerst in den hauptspeicher und für den prozess wird so eine speicherseite angelegt, wenn ich das richtig verstanden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730057</guid><dc:creator><![CDATA[player424]]></dc:creator><pubDate>Sat, 20 Jun 2009 13:10:18 GMT</pubDate></item><item><title><![CDATA[Reply to verständnisfrage bei dll&#x27;s on Sun, 21 Jun 2009 01:33:46 GMT]]></title><description><![CDATA[<p>Klingt nicht so als ob du es wirklich verstanden hättest <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Such dir im Netz ein paar Artikel zum Thema Virtual Memory, vielleicht geht dann ein Lich auf...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730308</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 21 Jun 2009 01:33:46 GMT</pubDate></item></channel></rss>