<?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 (dynamische) DLL]]></title><description><![CDATA[<p>Hallo,</p>
<p>beschäftige mich seit Kurzem mit ein wenig DLL.</p>
<p>So wie ich es verstehe, heißt dynamisch also nur einmal im Speicher geladen und kann paralell von mehreren Programmen aufgerufen werden.</p>
<p>Meine Frage, wenn ich in einer DLL eine Variable erzeuge, wieso kann ich nicht aus mehren Programmen auf diese Variable zugreifen. Die DLL ist doch nur einmal im Speicher, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

static int i = 0;

DLLEXPORT BOOL APIENTRY 
	DllMain(
		  HANDLE hModule
		, DWORD  ul_reason_for_call
		, LPVOID lpReserved)
{
	char buf[255];

	switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:

			sprintf(buf, &quot;Test: %d&quot;, ++i);
			MessageBox(NULL, buf, &quot;Test&quot;, 0);

			break;

		case DLL_THREAD_ATTACH:
			break;
		case DLL_THREAD_DETACH:
			break;
		case DLL_PROCESS_DETACH:

			sprintf(buf, &quot;Test: %d&quot;, --i);
			MessageBox(NULL, buf, &quot;Test&quot;, 0);

			break;
		default:
	}
	return TRUE;
}
</code></pre>
<p>Wenn ich diese DLL übersetze und ein Programm starte, das eine Funktion daraus aufruft, ist die Abfolge des Zählers bei jedem Programm gleich: zuertst 1 und dann 0.</p>
<p>Verstehe ich hier etwas nicht?</p>
<p>Danke für die Mühe<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/163033/verständnisfrage-dynamische-dll</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 18:54:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/163033.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Oct 2006 12:50:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 12:50:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>beschäftige mich seit Kurzem mit ein wenig DLL.</p>
<p>So wie ich es verstehe, heißt dynamisch also nur einmal im Speicher geladen und kann paralell von mehreren Programmen aufgerufen werden.</p>
<p>Meine Frage, wenn ich in einer DLL eine Variable erzeuge, wieso kann ich nicht aus mehren Programmen auf diese Variable zugreifen. Die DLL ist doch nur einmal im Speicher, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

static int i = 0;

DLLEXPORT BOOL APIENTRY 
	DllMain(
		  HANDLE hModule
		, DWORD  ul_reason_for_call
		, LPVOID lpReserved)
{
	char buf[255];

	switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:

			sprintf(buf, &quot;Test: %d&quot;, ++i);
			MessageBox(NULL, buf, &quot;Test&quot;, 0);

			break;

		case DLL_THREAD_ATTACH:
			break;
		case DLL_THREAD_DETACH:
			break;
		case DLL_PROCESS_DETACH:

			sprintf(buf, &quot;Test: %d&quot;, --i);
			MessageBox(NULL, buf, &quot;Test&quot;, 0);

			break;
		default:
	}
	return TRUE;
}
</code></pre>
<p>Wenn ich diese DLL übersetze und ein Programm starte, das eine Funktion daraus aufruft, ist die Abfolge des Zählers bei jedem Programm gleich: zuertst 1 und dann 0.</p>
<p>Verstehe ich hier etwas nicht?</p>
<p>Danke für die Mühe<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1160985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1160985</guid><dc:creator><![CDATA[....]]></dc:creator><pubDate>Wed, 25 Oct 2006 12:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 12:56:52 GMT]]></title><description><![CDATA[<p>Eine DLL wird für jede Programminstanz einmal geladen. Mehrere Starts der Anwendung heißt also das die DLL auch mehrmals geladen wird.<br />
Wenn du Daten zwischen 2 oder mehr Anwendungen austauschen willst, such mal nach Shared Memory (bzw. Mapped Memory), ansonsten musst du die Daten einfach in eine Datei schreiben und vom anderen Programm lesen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1160992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1160992</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 25 Oct 2006 12:56:52 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 13:12:32 GMT]]></title><description><![CDATA[<p>.... schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>beschäftige mich seit Kurzem mit ein wenig DLL.</p>
<p>So wie ich es verstehe, heißt dynamisch also nur einmal im Speicher geladen und kann paralell von mehreren Programmen aufgerufen werden....</p>
</blockquote>
<p>Das ist ein gar nicht mal so seltenes Mißverständnis !<br />
Es muß heißen &quot;...heißt dynamisch also nur einmal <strong>auf die Festplatte</strong> geladen ...&quot; !<br />
Was daran toll ist ?<br />
-&gt; Wenn Du eine oft genutzte Funktionalität (sagen wir mal: Die Ausgabe einer Meldung in einer MessageBox) aus einer statischen lib verwendest, wird der Programmcode (sagen wir mal 500 KB), der das macht in jede .exe fest eingelinkt.<br />
-&gt; Hast Du nun 100 executables, die diese Funktionalität nutzen wollen, belegt allein das 50 MB auf der Platte. (im Dynamischen Fall wären das einmal 500 KB in einer DLL)<br />
-&gt; Machst Du das für 10 Funktionalitäten, hast Du die Wahl zwischen:</p>
<ul>
<li>einer 5-MB-DLL und</li>
<li>500 MB in executables.</li>
</ul>
<p>Außerdem kannst Du auf diese Weise einen Fehler in der Implementierung der Funktionalität in EINER DLL fixen und alle 100 executables arbeiten mit der korrigierten Fassung. (Andernfalls mußt Du 100 executables ggf. von 10 verschiedenen Herstellern fixen lassen).</p>
<p>Ist also schon ein Vorteil.</p>
<p>Gruß,</p>
<p>Simon2.</p>
<p>P.S.: Andererseits hat natürlich die Kopplung von 100 exes durch eine DLL auch Nachteile - z.B. wenn eine Software die Funktionalität in einer anderen Version braucht als eine andere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161000</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 25 Oct 2006 13:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 15:00:54 GMT]]></title><description><![CDATA[<p>also, erst einmal vielen Dank für die Antworten! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3227">@Vellas</a></p>
<p>Vellas schrieb:</p>
<blockquote>
<p>Wenn du Daten zwischen 2 oder mehr Anwendungen austauschen willst, such mal nach Shared Memory (bzw. Mapped Memory)...</p>
</blockquote>
<p>Das würde mich sehr interessieren! Geht das auch mit win und api???</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a><br />
Danke für die ausführliche Info ;). Das habe ich noch nie in so einer ausführliche Formulierung vorgefunden!</p>
<p>Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161072</guid><dc:creator><![CDATA[....]]></dc:creator><pubDate>Wed, 25 Oct 2006 15:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 15:59:28 GMT]]></title><description><![CDATA[<p>.... schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3227">@Vellas</a></p>
<p>Vellas schrieb:</p>
<blockquote>
<p>Wenn du Daten zwischen 2 oder mehr Anwendungen austauschen willst, such mal nach Shared Memory (bzw. Mapped Memory)...</p>
</blockquote>
<p>Das würde mich sehr interessieren! Geht das auch mit win und api???</p>
</blockquote>
<p>Klar, guck mal nach folgenden Funktionen:<br />
CreateFile, CreateFileMapping, MapViewOfFile, UnmapViewOfFile und CloseHandle.<br />
Außerdem solltest du dir evtl. noch CEvent ansehen, damit kannst du von einer Hauptanwendung eine andere zu verarbeitende Anwendung benachrichtigen, wenn eine bestimmte Aktion in der Hauptanwendung gemacht wurde (z.B. Verarbeitung abgebrochen).</p>
<p>Greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161127</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 25 Oct 2006 15:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 16:01:19 GMT]]></title><description><![CDATA[<p>Soweit ich weiß werden DLLs tatsächlich nur einmal geladen,<br />
allerdings werden lokale Variablen für jede Instanz separat<br />
erzeugt; (eigenes Datensgment pro Instanz)</p>
<p>Die geladene DLL-Instanz kann ja vom Programm (exe) direkt<br />
angesprochen werden. Daher muß die DLL ins Datensegment<br />
der exe eingebunden sein.</p>
<p>Gemeinsam genutzt wird nur der Programmcode - insofern wird<br />
schon Speicher gespart. Die Ladezeit einer DLL, die bereits<br />
von einem anderen Programm benutzt wird sollte daher wesentlich<br />
kürzer sein als wenn die DLL das erste Mal geladen wird.</p>
<p>Schönen Gruß, khw</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161128</guid><dc:creator><![CDATA[khw]]></dc:creator><pubDate>Wed, 25 Oct 2006 16:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 18:24:07 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=403" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=4" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161262</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 25 Oct 2006 18:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 19:03:25 GMT]]></title><description><![CDATA[<p>khw hat recht. Und wenn man versucht den Programmcode zu ändern, gilt &quot;Copy-On-Write&quot; (wenn man das Recht dazu hat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161347</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 25 Oct 2006 19:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 19:04:51 GMT]]></title><description><![CDATA[<p>PE Images, und damit auch DLLs, werden nicht geladen, die werden in den Speicher abgebildet (&quot;gemappt&quot;). Pages die gebraucht werden werden dabei geladen, andere nicht unbedingt. Solange ein Image an die &quot;preferred load address&quot; geladen wird (=jede EXE und mit etwas Glück alle DLLs die eine &quot;passende&quot; base address verwenden) muss der Loader da drinnen auch keine Relocations fixen, und eine Page einer DLL verbraucht auch nur eine Page, egal wie viele Prozesse die verwenden.</p>
<p>Fängt nun ein Prozess an in solcherart gemappte Pages reinzuschreiben dann macht Windows beim ersten Schreibzugriff auf diese Page eine private Kopie für den entsprechenden Prozess.</p>
<p>All das gilt (vereinfacht gesagt) für Pages aus Sections die nicht &quot;shared&quot; markiert sind. Pages aus Sections die &quot;shared&quot; markiert sind sind von diesem &quot;Copy-On-Write&quot; nicht betroffen - d.h. Änderungen in &quot;shared&quot; sections sehen ALLE Prozesse.</p>
<p>Wenn du also diverse Variablen in einer DLL zwischen allen Prozessen teilen willst, dann packe die einfach in eine &quot;shared&quot; Section hinein. Dazu machst du ein DEF File und definierst da drinnen eine eigene Section ala so:</p>
<pre><code>LIBRARY &quot;LiLaLibrary&quot; BASE=0x12300000
SECTIONS
	.my_shared_section READ WRITE SHARED
</code></pre>
<p>Alternativ kannst du (ab VC 7.1 zumindest) ohne DEF File einfach jenes in irgendein Code-File schreiben:</p>
<pre><code class="language-cpp">#pragma section(&quot;.my_shared_section&quot;,read,write,shared)
</code></pre>
<p>Und dann packst du deine Variablen in diese section rein, ala so:</p>
<pre><code class="language-cpp">#pragma data_seg(&quot;.my_shared_section&quot;)

long g_v1 = 0;
int g_v2 = 0;
//...

#pragma data_seg()
</code></pre>
<p>Blubb <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161351</guid><dc:creator><![CDATA[Plotzenhotz]]></dc:creator><pubDate>Wed, 25 Oct 2006 19:04:51 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (dynamische) DLL on Wed, 25 Oct 2006 20:07:17 GMT]]></title><description><![CDATA[<p>Oh ha! Sehr beachtlich! Da lermt man ja ordentlich was Neues dazu!</p>
<p>Besten Dank an euch alle!!!</p>
<p>Werd ich morgen geleich mal ausprobieren <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="😉"
    /></p>
<p>Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1161466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1161466</guid><dc:creator><![CDATA[....]]></dc:creator><pubDate>Wed, 25 Oct 2006 20:07:17 GMT</pubDate></item></channel></rss>