<?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[SPcierh richtig freigeben??]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine DLL, welche eine Klasse hat:</p>
<p>Dll.h</p>
<pre><code class="language-cpp">#ifndef FILE1_H
#define FILE1_h
#include &lt;string&gt;
class __declspec(dllexport) Test
{
 public:
  std::string GetIt(){return &quot;hallo&quot;;}
};

#endif
</code></pre>
<p>dll.cpp</p>
<pre><code class="language-cpp">#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	return 1;
}

extern &quot;C&quot; __declspec(dllexport)Test* GetTest()
{
    return new Test;
}
</code></pre>
<p>Ausführendes Programm<br />
Main.cpp</p>
<pre><code class="language-cpp">void __fastcall TForm1::Button1Click(TObject *Sender)
{
Test* t;
typedef Test*(*pFunc)();
pFunc myFunc;
HINSTANCE h = LoadLibrary(&quot;Project2.dll&quot;);
if(h!=NULL)
   {
     myFunc = (pFunc)GetProcAddress(h,&quot;_GetTest&quot;);
     if(myFunc)
        {
          t = pFunc();
          std::string str = t-&gt;GetIt();
          ShowMessage(String(str.c_str()));
        }
     else
        {
            ShowMessage(&quot;Funktion wurde nicht gefunden&quot;);
        }
   }
else
   {
       ShowMessage(&quot;Datei konnte nicht geladen werden&quot;);
   }
FreeLibrary(h);
}
</code></pre>
<p>meine Fragen:<br />
wo muss der speicher jetzt freigegeben werden?<br />
kann ich auch eine komplette instanz (kein zeiger) zurückgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171991/spcierh-richtig-freigeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 06:59:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171991.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Jan 2007 12:29:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SPcierh richtig freigeben?? on Wed, 31 Jan 2007 12:29:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine DLL, welche eine Klasse hat:</p>
<p>Dll.h</p>
<pre><code class="language-cpp">#ifndef FILE1_H
#define FILE1_h
#include &lt;string&gt;
class __declspec(dllexport) Test
{
 public:
  std::string GetIt(){return &quot;hallo&quot;;}
};

#endif
</code></pre>
<p>dll.cpp</p>
<pre><code class="language-cpp">#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	return 1;
}

extern &quot;C&quot; __declspec(dllexport)Test* GetTest()
{
    return new Test;
}
</code></pre>
<p>Ausführendes Programm<br />
Main.cpp</p>
<pre><code class="language-cpp">void __fastcall TForm1::Button1Click(TObject *Sender)
{
Test* t;
typedef Test*(*pFunc)();
pFunc myFunc;
HINSTANCE h = LoadLibrary(&quot;Project2.dll&quot;);
if(h!=NULL)
   {
     myFunc = (pFunc)GetProcAddress(h,&quot;_GetTest&quot;);
     if(myFunc)
        {
          t = pFunc();
          std::string str = t-&gt;GetIt();
          ShowMessage(String(str.c_str()));
        }
     else
        {
            ShowMessage(&quot;Funktion wurde nicht gefunden&quot;);
        }
   }
else
   {
       ShowMessage(&quot;Datei konnte nicht geladen werden&quot;);
   }
FreeLibrary(h);
}
</code></pre>
<p>meine Fragen:<br />
wo muss der speicher jetzt freigegeben werden?<br />
kann ich auch eine komplette instanz (kein zeiger) zurückgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220438</guid><dc:creator><![CDATA[rrrefd]]></dc:creator><pubDate>Wed, 31 Jan 2007 12:29:37 GMT</pubDate></item><item><title><![CDATA[Reply to SPcierh richtig freigeben?? on Wed, 31 Jan 2007 12:47:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Du solltest die Instanz von Test, die du von GetTest() bekommst innerhalb der dll, d.h. mit Hilfe einer dort definierten Funktion freigeben. Es soll zwar theoretisch auch außerhalb gehen, hat bei mir aber noch nie so recht funktioniert.<br />
Also</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport)void freeTest(Test* t)
{
    delete t;
}
</code></pre>
<p>Du solltest keine vollständige Instanz zurückgeben. Das kann gut gehen solange die dll und das ausführende Programm mit dem gleichen Compiler erstellt wurden. Wenn nicht, kann es sein, dass die Klasseninstanzen nicht binärkompatibel sind (mit fällt gerade kein anderer Ausdruck dafür ein). Das trifft übrigens auch auf std::string zu. Wenn die dll mit dem BCB5 erstellt wurde, das aufrufende Programm aber mit dem BCB6, kann es da auch crashen, da beide Compiler unterschiedliche STL-Implementationen verwenden (hatte ich schon mal). Versuche möglichst nur PODs zurückzugeben, wenn du die dll verbreiten willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220448</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 31 Jan 2007 12:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to SPcierh richtig freigeben?? on Wed, 31 Jan 2007 13:18:57 GMT]]></title><description><![CDATA[<p>und diese methode rufe ich dann im mainprogramm auf, nachdem ich t benutzt habe mit freeTest(t) auf?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220470</guid><dc:creator><![CDATA[rrrefd]]></dc:creator><pubDate>Wed, 31 Jan 2007 13:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to SPcierh richtig freigeben?? on Wed, 31 Jan 2007 13:42:14 GMT]]></title><description><![CDATA[<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1220493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1220493</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 31 Jan 2007 13:42:14 GMT</pubDate></item></channel></rss>