<?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[Frage zu DLL.... C &amp;lt;-&amp;gt; C++]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe eine (MFC-)DLL die ein C-Interface bereit stellen soll. Die nach außen öffentlichen Funktionen hab ich dabei mit extern &quot;C&quot; kenntlich gemacht. Reicht das aus, damit man die dann auch tatsächlich als C Interface benutzen kann ?<br />
In der Implementierung der Funktionen benutze ich z.B. auch eigens für diese DLL geschriebene Klassen, aber das sollte keine Probleme bereitstellen oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161867/frage-zu-dll-c-lt-gt-c</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 21:52:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161867.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Oct 2006 19:22:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Wed, 11 Oct 2006 19:22:14 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe eine (MFC-)DLL die ein C-Interface bereit stellen soll. Die nach außen öffentlichen Funktionen hab ich dabei mit extern &quot;C&quot; kenntlich gemacht. Reicht das aus, damit man die dann auch tatsächlich als C Interface benutzen kann ?<br />
In der Implementierung der Funktionen benutze ich z.B. auch eigens für diese DLL geschriebene Klassen, aber das sollte keine Probleme bereitstellen oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153127</guid><dc:creator><![CDATA[nep]]></dc:creator><pubDate>Wed, 11 Oct 2006 19:22:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Wed, 11 Oct 2006 19:32:10 GMT]]></title><description><![CDATA[<p>extern &quot;C&quot; reicht natürlich noch nicht aus... damit wird eine Funktion *nicht* in der DLL exportiert!</p>
<p>Du musst entweder eine DEF-Datei erzeugen, indem Du die Funktionen explizit aufführst, welche Du zur Verfügung stellen willst; oder Du verwendest ein &quot;__declspec(dllexport)&quot; (was aber &quot;unschöne&quot; Namen erzeugt; also ich rate hiervon ab).</p>
<p>PS: Bei den Parametern/Rückgabewerte der Funktionen solltest Du darauf achten, dass sie keine Abhängigkeiten zu irgendeiner CRT-DLL haben; sonst könnte es da diverse Probleme geben... also kein FILE*, std::string oder sonstwas CRT-mässiges übergeben; nur &quot;Grunddatentypen&quot;...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153132</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 11 Oct 2006 19:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Wed, 11 Oct 2006 21:51:06 GMT]]></title><description><![CDATA[<p>Hi,<br />
danke erst mal für die schnelle Antwort. Dass das alleine für den Export nicht ausreicht war mir schon klar; mir ging es eben nur darum ob ich sonst noch irgendwelche speziellen Dinge beachten muss, damit das auch wirklich ein C Interface bleibt.</p>
<p>Wenn ich das dann richtig verstehe, kann ich in der Implementation der Funktion auch Klassen usw. benutzen, solange die Rückgabewerte und Parameter C-konform sind, richtig ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153198</guid><dc:creator><![CDATA[nep]]></dc:creator><pubDate>Wed, 11 Oct 2006 21:51:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Thu, 12 Oct 2006 05:26:00 GMT]]></title><description><![CDATA[<p>Was Du in der Implementierung machst ist eigentlich vollkommen wurst.<br />
Du musst aber wirklich darauf achten, dass Du nur &quot;Grunddatentypen&quot; verwendest und niemals Dinge aus der MS-CRT (wie eben FILE* oder sonstige CRT-spezifischen Dinge). Auch darfast Du nie in der DLL Speicher allokieren, welcher ausserhalb der DLL freigegeben werden soll. Für das freigeben musst Du dann auch eine Funktionexportieren, welche dann aufgerufen werden muss.</p>
<p>Das besten Beispiel für eine &quot;reine&quot; C-DLL ist die gesamte WinAPI.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153234</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 12 Oct 2006 05:26:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Thu, 12 Oct 2006 17:08:31 GMT]]></title><description><![CDATA[<p>Mh noch eine Frage...<br />
Wie macht man das denn eigentlich am geschicktesten wenn man eben mehrere C-Funktionen als Interface anbietet, aber diese Funktionen intern ein gemeinsames Klassenobjekt benutzen ? Ich hab das bei mir bis jetzt so gemacht:</p>
<pre><code class="language-cpp">//Interface.h

//Den DLL-&quot;Overhead&quot; hab ich der Einfachheit halber weggelassen

MyClass* object = NULL;

extern &quot;C&quot; 
{
   void startFunc();

   void func1();
   void func2();

   void endFunc();
}
</code></pre>
<pre><code class="language-cpp">//Interface.cpp 
void startFunc() {
  if (object == NULL)
      object = new MyClass();

  //Hier was damit tun
}

void func1() 
{
   if (object != NULL) {
        //hier was mit object machen
   }
}

usw...

void endFunc()
{
   if (object != NULL)
   {
      delete object;
      object = NULL;
   }
}
</code></pre>
<p>Funktionieren tut das so...aber vielleicht gibts da noch bessere Möglichkeiten ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153828</guid><dc:creator><![CDATA[nep]]></dc:creator><pubDate>Thu, 12 Oct 2006 17:08:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Thu, 12 Oct 2006 18:44:58 GMT]]></title><description><![CDATA[<p>Du übergibst nach extern ein &quot;HANDLE&quot;...</p>
<p>z.B.</p>
<pre><code class="language-cpp">typedef void* MyHandle;

MyHandle init();
int func1(MyHandle handle);
double func2(MyHandle handle);
void deinit(MyHandle handle)
</code></pre>
<p>Und intern verwendest Du das &quot;MyHandle&quot; dazu dieses zur &quot;Klasse&quot; zu casten.</p>
<p>Aber eigentlich solltest Du Deine Funktionen gleich so machen:</p>
<pre><code class="language-cpp">typedef DWORD MyResult;
#define MYDLL_S_OK 0
#define MYDDL_E_INVALID_HANDLE
// ...

typedef void* MyHandle;

MyResult init(MyHandle *pHandle);
MyResult func1(MyHandle handle, int *pOutInt);
MyResult func2(MyHandle handle, double *pOutDouble);
MyResult deinit(MyHandle handle)
</code></pre>
<p>Und das ganze am besten noch mit SAL:<br />
<a href="http://blogs.msdn.com/michael_howard/archive/2006/05/19/602077.aspx" rel="nofollow">http://blogs.msdn.com/michael_howard/archive/2006/05/19/602077.aspx</a><br />
<a href="http://msdn2.microsoft.com/en-us/library/ms235402.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms235402.aspx</a></p>
<p>=&gt;</p>
<pre><code class="language-cpp">typedef DWORD MyResult;
#define MYDLL_S_OK 0
#define MYDDL_E_INVALID_HANDLE
// ...

typedef void* MyHandle;

MyResult init(__out MyHandle *pHandle);
MyResult func1(__in MyHandle handle, __out int *pOutInt);
MyResult func2(__in MyHandle handle, __out double *pOutDouble);
MyResult deinit(__in MyHandle handle)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1153882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153882</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 12 Oct 2006 18:44:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Fri, 13 Oct 2006 08:35:19 GMT]]></title><description><![CDATA[<p>Mh also ich hab mir die Links jetzt nicht angeschaut... aber ist das nicht so, dass dadurch die Funktionen anders von außerhalb aufgerufen werden müssen, oder bleibt das so trotzdem gleich ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154063</guid><dc:creator><![CDATA[nep]]></dc:creator><pubDate>Fri, 13 Oct 2006 08:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu DLL.... C &amp;lt;-&amp;gt; C++ on Fri, 13 Oct 2006 11:27:05 GMT]]></title><description><![CDATA[<p>Bzg. SAL ändert sich von aussen gar nichts.... so wurde z.B. das gesamte SDK jetzt mit SAL Kommentaren versehen... hat sich jetzt dadurch das SDK geändert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154081</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Fri, 13 Oct 2006 11:27:05 GMT</pubDate></item></channel></rss>