<?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[statische dlls und speicherverwaltung]]></title><description><![CDATA[<p>Hallo,<br />
ich bin dabei ein Größere eigene Sammlung von Funktionen und Klassen in eine statische DLL zu kompilieren. Vorher habe ich sie einfach nur mit dem Projekt mitkompiliert.</p>
<p>Gibt es da irgendwelche Dinge auf die ich achten sollte?<br />
Z.b. mit der Speicherverwaltung. Habe z.b. unter <a href="http://msdn2.microsoft.com/en-us/library/ms682594.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms682594.aspx</a> gelesen, dass die Anwendung und die DLL ein gemeinsamen Speicher verwendet. Gilt das auch für den C++ Speichermanager?</p>
<p>Ich habe dazu eine einfache Test-Anwendung geschrieben. Funktionierte ohne Probleme. Hat aber vielleicht nix mit Realität zu tun...</p>
<p>Unter <a href="http://msdn2.microsoft.com/en-us/library/d1587c1h(VS.80).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/d1587c1h(VS.80).aspx</a> steht außerdem:</p>
<blockquote>
<p>An application can own things such as a stack, global memory, file handles, and a message queue, but a DLL cannot.</p>
</blockquote>
<p>Heißt das, dass ich beispielsweise keine Dateien öffnen und bearbeiten kann?<br />
Aber ein einfacher Aufruf von:</p>
<pre><code class="language-cpp">std::ofstream out(&quot;c:\\ausgabe.txt&quot;);
out &lt;&lt; &quot;hallo&quot;
</code></pre>
<p>funktioniert innerhalb der Dll.</p>
<p>Was noch wichtig zu erwähnen wäre, ist dass ich primär den GCC bzw. mingw verwende. Sollte aber theoretisch auch mit anderen Compilern funktionieren.</p>
<p>Der Code wurde portabel geschrieben, sodass er sich auch unter Linux kompilieren lässt. Würde deswegen auch gerne hier was im Bezug auf linux hören.</p>
<p>Es gibt auch einfache Dialoge, unter Windows direkt mit der WinAPI unter Linux vorerst als Konsolen-Ein/Ausgabe. Außerdem verwende ich OpenGL und SDL. Könnte da was mit DLLs schieflaufen?</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192011/statische-dlls-und-speicherverwaltung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 20:02:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192011.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Sep 2007 14:58:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to statische dlls und speicherverwaltung on Sun, 09 Sep 2007 14:58:51 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich bin dabei ein Größere eigene Sammlung von Funktionen und Klassen in eine statische DLL zu kompilieren. Vorher habe ich sie einfach nur mit dem Projekt mitkompiliert.</p>
<p>Gibt es da irgendwelche Dinge auf die ich achten sollte?<br />
Z.b. mit der Speicherverwaltung. Habe z.b. unter <a href="http://msdn2.microsoft.com/en-us/library/ms682594.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms682594.aspx</a> gelesen, dass die Anwendung und die DLL ein gemeinsamen Speicher verwendet. Gilt das auch für den C++ Speichermanager?</p>
<p>Ich habe dazu eine einfache Test-Anwendung geschrieben. Funktionierte ohne Probleme. Hat aber vielleicht nix mit Realität zu tun...</p>
<p>Unter <a href="http://msdn2.microsoft.com/en-us/library/d1587c1h(VS.80).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/d1587c1h(VS.80).aspx</a> steht außerdem:</p>
<blockquote>
<p>An application can own things such as a stack, global memory, file handles, and a message queue, but a DLL cannot.</p>
</blockquote>
<p>Heißt das, dass ich beispielsweise keine Dateien öffnen und bearbeiten kann?<br />
Aber ein einfacher Aufruf von:</p>
<pre><code class="language-cpp">std::ofstream out(&quot;c:\\ausgabe.txt&quot;);
out &lt;&lt; &quot;hallo&quot;
</code></pre>
<p>funktioniert innerhalb der Dll.</p>
<p>Was noch wichtig zu erwähnen wäre, ist dass ich primär den GCC bzw. mingw verwende. Sollte aber theoretisch auch mit anderen Compilern funktionieren.</p>
<p>Der Code wurde portabel geschrieben, sodass er sich auch unter Linux kompilieren lässt. Würde deswegen auch gerne hier was im Bezug auf linux hören.</p>
<p>Es gibt auch einfache Dialoge, unter Windows direkt mit der WinAPI unter Linux vorerst als Konsolen-Ein/Ausgabe. Außerdem verwende ich OpenGL und SDL. Könnte da was mit DLLs schieflaufen?</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1361945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1361945</guid><dc:creator><![CDATA[matimatiker]]></dc:creator><pubDate>Sun, 09 Sep 2007 14:58:51 GMT</pubDate></item><item><title><![CDATA[Reply to statische dlls und speicherverwaltung on Sun, 09 Sep 2007 15:26:07 GMT]]></title><description><![CDATA[<p>DLL = <strong>Dynamic</strong> Link Library.</p>
<blockquote>
<p>Gibt es da irgendwelche Dinge auf die ich achten sollte?<br />
Z.b. mit der Speicherverwaltung. Habe z.b. unter <a href="http://msdn2.microsoft.com/en-us/library/ms682594.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms682594.aspx</a> gelesen, dass die Anwendung und die DLL ein gemeinsamen Speicher verwendet. Gilt das auch für den C++ Speichermanager?</p>
</blockquote>
<p>Du solltest Speicher, den du mit malloc/new in der DLL alloziert hast, auch von der DLL wieder freigeben lassen und nicht von anderen Modulen, weil sie unterschiedliche C/C++ Laufzeitbibliotheken nutzen können.</p>
<blockquote>
<blockquote>
<p>An application can own things such as a stack, global memory, file handles, and a message queue, but a DLL cannot.</p>
</blockquote>
<p>Heißt das, dass ich beispielsweise keine Dateien öffnen und bearbeiten kann?</p>
</blockquote>
<p>Nein. Wenn du die DLL in deinen Prozess einblendest, kannst du natürlich Dateien öffnen und alles andere ganz normal machen. Das da oben soll wohl eher heißen, daß die DLL im Speicher als solche diese Dinge nicht hat, weil sie ja kein eigenständiger Prozess ist, sondern nur von Prozessen eingeblendet wird und dann Bestandteil dieser wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1361989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1361989</guid><dc:creator><![CDATA[tenchou]]></dc:creator><pubDate>Sun, 09 Sep 2007 15:26:07 GMT</pubDate></item><item><title><![CDATA[Reply to statische dlls und speicherverwaltung on Sun, 09 Sep 2007 16:37:32 GMT]]></title><description><![CDATA[<p>tenchou schrieb:</p>
<blockquote>
<p>DLL = <strong>Dynamic</strong> Link Library.</p>
</blockquote>
<p>Meinte mit statisch die load-time dlls. Wirds bloß öffters mit statisch bezeichnet.</p>
<blockquote>
<p>Du solltest Speicher, den du mit malloc/new in der DLL alloziert hast, auch von der DLL wieder freigeben lassen und nicht von anderen Modulen, weil sie unterschiedliche C/C++ Laufzeitbibliotheken nutzen können.</p>
</blockquote>
<p>Heißt das, dass ich das irgnorieren kann, wenn die dll und die Anwendung mit demselben compiler (gleiche version) kompiliert wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1362038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1362038</guid><dc:creator><![CDATA[matimatiker]]></dc:creator><pubDate>Sun, 09 Sep 2007 16:37:32 GMT</pubDate></item><item><title><![CDATA[Reply to statische dlls und speicherverwaltung on Tue, 11 Sep 2007 10:03:03 GMT]]></title><description><![CDATA[<p>matimatiker schrieb:</p>
<blockquote>
<p>Heißt das, dass ich das irgnorieren kann, wenn die dll und die Anwendung mit demselben compiler (gleiche version) kompiliert wurde?</p>
</blockquote>
<p>Nein, das heißt ja nicht, daß sie nicht verschiedene C/C++ Laufzeitbibliotheken Versionen benutzen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363136</guid><dc:creator><![CDATA[tenchou]]></dc:creator><pubDate>Tue, 11 Sep 2007 10:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to statische dlls und speicherverwaltung on Wed, 12 Sep 2007 00:18:21 GMT]]></title><description><![CDATA[<p>WENN du überall die gleiche Runtime DLL (!) verwendest dann hast du keine Probleme und &quot;kannst das ignorieren&quot;.</p>
<p>ad Runtime DLL (!): es funktioniert i.A. nicht wenn du statisch gegen die Runtime linkst. Mit VC6 zumindest garantiert nicht. Mit VC8 muss ich es erst probieren -- kann sein dass der Standardmässig den Process Heap verwendet, dann ginge Speicher rumreichen schonmal. Allerdings sind dann andere Dinge doppelt die nicht doppelt sein sollten, also am besten immer DLL Version der Runtime verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363736</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 12 Sep 2007 00:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to statische dlls und speicherverwaltung on Wed, 12 Sep 2007 15:35:03 GMT]]></title><description><![CDATA[<p>Habe im Moment ein anderes Problem.<br />
Z.b. wird in der Dll speicher angefordert. Wenn ich aber vom Programm aus, darauf zugreife, so zeigt der entsprechende Pointer immer noch nach nirgendwo.</p>
<p>Werde mir am Wochende mal genauer anschauen und dann &quot;berichten&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364113</guid><dc:creator><![CDATA[matimatiker]]></dc:creator><pubDate>Wed, 12 Sep 2007 15:35:03 GMT</pubDate></item><item><title><![CDATA[Reply to statische dlls und speicherverwaltung on Wed, 12 Sep 2007 16:58:03 GMT]]></title><description><![CDATA[<p>Nagut, konnte nicht bis zum Wochende warten.</p>
<p>Habe <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-192117.html" rel="nofollow">diesen</a> Thread gelesen. Eigentlich das gleiche Problem.<br />
Also habe ich ein Testprogramm geschrieben.</p>
<pre><code class="language-cpp">//-------------------------------------------------------
// dll.h
//-------------------------------------------------------
#ifndef DLL_H_INCLUDED
#define DLL_H_INCLUDED

#ifdef DLL_EXPORT
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

template &lt;typename T&gt;
class Test
{
public:
   static T* Get()
   {
      return &amp;m_instance;
   }
private:
   static T m_instance;
};

template &lt;typename T&gt;
T Test&lt;T&gt;::m_instance;

//-----
int* EXPORT Get();

#endif

//-------------------------------------------------------
// dll.cpp
//-------------------------------------------------------
#include &quot;dll.h&quot;

int* Get()
{
   return Test&lt;int&gt;::Get();
}

//--------------------------------------------------------
// app.cpp
//--------------------------------------------------------
#include &lt;iostream&gt;

#include &quot;dll.h&quot;

int main()
{
   std::cout &lt;&lt; Test&lt;int&gt;::Get() &lt;&lt; std::endl;
   std::cout &lt;&lt; Get() &lt;&lt; std::endl;
}
</code></pre>
<p>Und tatsächlich werden da zwei verschiedene Adressen ausgegeben.</p>
<p>compiliert mit mingw 3.4.5 unter winxp. Die dll mit</p>
<pre><code>g++ -D DLL_EXPORT -shared -o testdll.dll dll.cpp -Wl,--out-implib,libtestdll.a
</code></pre>
<p>Die Exe mit</p>
<pre><code>g++ app.cpp -L. -ltestdll
</code></pre>
<p>Ok, ein Problem weniger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364158</guid><dc:creator><![CDATA[matimatiker]]></dc:creator><pubDate>Wed, 12 Sep 2007 16:58:03 GMT</pubDate></item></channel></rss>