<?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[DLL Datentypen]]></title><description><![CDATA[<p>Moin,moin.</p>
<p>Ich habe folgenden Code, der das API einer DLL darstellen soll:</p>
<pre><code>#pragma once
#ifndef _MAIN_H_
#define _MAIN_H_
#include &lt;string&gt;

namespace foo {
	struct result {
		std::string timestamp;
		double ut0;
		double ut90;
		double it0;
		double it90;
		double urec0;
		double urec90;
		double unm0;
		double unm90;
		double stDevIT;
		double stdDevURec;
		double stdDevUmn;
		double r2p;
		double phase2p;
		double ci;
		double ip;
		double sUt0;
		double sUt90;
		double sUrec0;
		double sUrec90;
		double sIt0;
		double sIt90;
		double sUnm0;
		double sUnm90;
		double rho;
		double ip4p;
		double adcMinCh0;
		double adcMaxCh0;
		double adcMinCh1;
		double adcMaxCh1;
		double adcMinCh2;
		double adcMaxCh2;
		double adcMinCh3;
		double adcMaxCh3;
		double adcMinCh4;
		double adcMaxCh4;
		double adcMinCh5;
		double adcMaxCh5;
		int messtyp;
		int slideID;
		double uOut;
	};

	extern &quot;C&quot; __declspec(dllexport) bool StartMeasureLoop(std::string databaseFileName, void(*GetResultCallback)(foo::result result), std::string &amp;error);

	extern &quot;C&quot; __declspec(dllexport) bool StartMeasure(std::string databaseFileName, void(*GetResultCallback)(foo::result result), int measureId, std::string &amp;error);

	extern &quot;C&quot; __declspec(dllexport) bool StopMeasure(std::string &amp;error);
}
#endif
</code></pre>
<p>Wenn ich die DLL so erstelle, treten merkwürdige Speicherfehler auf, wenn ich sie in einem anderen C++ Programm benutzen will.</p>
<p>Ich vermute, dass es an den Datentypen der Parameter liegt... <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>Ich hoffe, dass mir da jemand weiterhelfen kann und bedanke mich im Voraus <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>Lg Henrik <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/topic/327677/dll-datentypen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 13:32:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327677.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Aug 2014 21:38:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL Datentypen on Tue, 26 Aug 2014 21:39:29 GMT]]></title><description><![CDATA[<p>Moin,moin.</p>
<p>Ich habe folgenden Code, der das API einer DLL darstellen soll:</p>
<pre><code>#pragma once
#ifndef _MAIN_H_
#define _MAIN_H_
#include &lt;string&gt;

namespace foo {
	struct result {
		std::string timestamp;
		double ut0;
		double ut90;
		double it0;
		double it90;
		double urec0;
		double urec90;
		double unm0;
		double unm90;
		double stDevIT;
		double stdDevURec;
		double stdDevUmn;
		double r2p;
		double phase2p;
		double ci;
		double ip;
		double sUt0;
		double sUt90;
		double sUrec0;
		double sUrec90;
		double sIt0;
		double sIt90;
		double sUnm0;
		double sUnm90;
		double rho;
		double ip4p;
		double adcMinCh0;
		double adcMaxCh0;
		double adcMinCh1;
		double adcMaxCh1;
		double adcMinCh2;
		double adcMaxCh2;
		double adcMinCh3;
		double adcMaxCh3;
		double adcMinCh4;
		double adcMaxCh4;
		double adcMinCh5;
		double adcMaxCh5;
		int messtyp;
		int slideID;
		double uOut;
	};

	extern &quot;C&quot; __declspec(dllexport) bool StartMeasureLoop(std::string databaseFileName, void(*GetResultCallback)(foo::result result), std::string &amp;error);

	extern &quot;C&quot; __declspec(dllexport) bool StartMeasure(std::string databaseFileName, void(*GetResultCallback)(foo::result result), int measureId, std::string &amp;error);

	extern &quot;C&quot; __declspec(dllexport) bool StopMeasure(std::string &amp;error);
}
#endif
</code></pre>
<p>Wenn ich die DLL so erstelle, treten merkwürdige Speicherfehler auf, wenn ich sie in einem anderen C++ Programm benutzen will.</p>
<p>Ich vermute, dass es an den Datentypen der Parameter liegt... <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>Ich hoffe, dass mir da jemand weiterhelfen kann und bedanke mich im Voraus <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>Lg Henrik <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/2415032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415032</guid><dc:creator><![CDATA[GrinzPrinz]]></dc:creator><pubDate>Tue, 26 Aug 2014 21:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Tue, 26 Aug 2014 21:51:30 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/200753" rel="nofollow">Vielleicht</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415034</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 26 Aug 2014 21:51:30 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Tue, 26 Aug 2014 21:54:20 GMT]]></title><description><![CDATA[<p>Soweit ich weiß ist es problematisch Container aus der Standardlib (z.b. std::string) als Parameter ener exportieren Funktion zu nutzen.<br />
Außerdem musst du bei structs als Parameter auf das Padding aufpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415036</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Tue, 26 Aug 2014 21:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Tue, 26 Aug 2014 22:19:41 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Soweit ich weiß ist es problematisch Container aus der Standardlib (z.b. std::string) als Parameter ener exportieren Funktion zu nutzen.<br />
Außerdem musst du bei structs als Parameter auf das Padding aufpassen.</p>
</blockquote>
<p>Wem soll das Blabla helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415037</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 26 Aug 2014 22:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 11:02:50 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Soweit ich weiß ist es problematisch Container aus der Standardlib (z.b. std::string) als Parameter ener exportieren Funktion zu nutzen.<br />
Außerdem musst du bei structs als Parameter auf das Padding aufpassen.</p>
</blockquote>
<p>Wem soll das Blabla helfen?</p>
</blockquote>
<p>Jedem der Google nutzen kann ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Spätestens wenn du die DLL mit einem anderen Compiler und anderen Settings kompilierst fliegt dir das so wie es jetzt ist um die Ohren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415072</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 27 Aug 2014 11:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 16:22:56 GMT]]></title><description><![CDATA[<p>Hä, sollte man die extern &quot;C&quot; - Funktionen nicht außerhalb des Namespaces definieren? Sonst würde das extern &quot;C&quot; doch keinen Sinn machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415117</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Wed, 27 Aug 2014 16:22:56 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 17:52:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Außerdem musst du bei structs als Parameter auf das Padding aufpassen.</p>
</blockquote>
<p>das heißt letztendlich? Soll man die structs packen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415121</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 27 Aug 2014 17:52:03 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 19:15:59 GMT]]></title><description><![CDATA[<p>Tim06TR schrieb:</p>
<blockquote>
<blockquote>
<p>Außerdem musst du bei structs als Parameter auf das Padding aufpassen.</p>
</blockquote>
<p>das heißt letztendlich? Soll man die structs packen?</p>
</blockquote>
<p>Genau. Sonst läufst du Gefahr dass 2 Compiler die struct anders anlegen, und das willst du nicht. &quot;#pragma pack 1&quot; sollte reichen. Es wird wahrscheinlich auch ohne gehen, aber sicher ist sicher.</p>
<p>Mr.Long schrieb:</p>
<blockquote>
<p>Hä, sollte man die extern &quot;C&quot; - Funktionen nicht außerhalb des Namespaces definieren? Sonst würde das extern &quot;C&quot; doch keinen Sinn machen?</p>
</blockquote>
<p>Naja es geht schon, allerdings verlierst du halt die Namespaceinformation weil C keine Namespaces kennt. Sollte sich genau gleich verhalten wie wenn man die Funktion außerhalb des Namespaces hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415125</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 27 Aug 2014 19:15:59 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 19:27:32 GMT]]></title><description><![CDATA[<p>extern &quot;C&quot; ist aber sinnlos, wenn man C++ Datentypen (wie std::string) als Parameter (oder Rückgabewert) verwendet, da C damit ja nichts anfangen kann...</p>
<p>Ein anderes C++ Programm dagegen (welches mit demselben(!) Compiler erstellt wurde), sollte aber die Funktionen benutzen können (dafür ist aber dann das extern &quot;C&quot; nicht notwendig)!</p>
<p>PS: Die Callback-Funktion sollte den Parameter als &quot;const foo::result&amp; result&quot; entgegennehmen, damit nicht die gesamte Struktur kopiert werden muß).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415126</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 27 Aug 2014 19:27:32 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 21:02:59 GMT]]></title><description><![CDATA[<p>Ich kapere hier etwas den Thread, aber ich hätte gern zu seinen Fragen noch etwas mehr Details, da ich zufällig mich auch gerade zum ersten Mal etwas mit Bibliotheken beschäftige. (vorher hielt ich es für nicht notwendig)</p>
<p>normalerweise würde ich alles außerhalb der lib alloziieren und einen Zeiger übergeben.<br />
Für strings müsste ich aber die Länge vorher wissen</p>
<p>So wollte ich es machen: Der library eine alloc und dealloc Funktion für strings geben.</p>
<pre><code>PACK( // ist pragma pack 1 von allen compilern unterstützt? Hier mein altes compilerunabhängiges Pack macro.
struct String {
    int size;
    char* data;
});

// Im Host:
String* string = lib_get_some_string();
dll_free_string(string);
</code></pre>
<p>Wie macht man das, &quot;wenn man weiß wie es gemacht wird&quot; <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2415130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415130</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 27 Aug 2014 21:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 21:09:42 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>extern &quot;C&quot; ist aber sinnlos, wenn man C++ Datentypen (wie std::string) als Parameter (oder Rückgabewert) verwendet, da C damit ja nichts anfangen kann...</p>
</blockquote>
<p>Nein, ist es nicht. Bei extern &quot;C&quot; geht es ums name mangling, und wenn du eine Funktion foo() in eine DLL exportieren willst, dann moechtest du die auch als &quot;foo&quot; wieder finden.</p>
<p>Packing ist im Uebrigen komplett sinnlos, da Libs unter verschiedenen Compilern i.d.R. sowieso nicht kompatibel sind, u.A. wegen RTTI und Exceptions, aber auch weil stdlibs nicht kompatibel sind. Fuehrt hoechstens zu ineffizienterem Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415131</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 27 Aug 2014 21:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 21:18:22 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Packing ist im Uebrigen komplett sinnlos, da Libs unter verschiedenen Compilern i.d.R. sowieso nicht kompatibel sind, u.A. wegen RTTI und Exceptions, aber auch weil stdlibs nicht kompatibel sind. Fuehrt hoechstens zu ineffizienterem Code.</p>
</blockquote>
<p>Boah, ey, du hast nichtmal gelesen was Tim06TR geschrieben hat, oder? Oder haperts echt am Verständnis?</p>
<p>Nein, pragma pack ist NICHT sinnlos.<br />
Weil man mit C-artigen Interfaces wunderbar verschiedenste Compiler mischen kann.</p>
<p>*facepalm*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415132</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Aug 2014 21:18:22 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Wed, 27 Aug 2014 21:19:30 GMT]]></title><description><![CDATA[<p>Tim06TR schrieb:</p>
<blockquote>
<pre><code>PACK( // ist pragma pack 1 von allen compilern unterstützt? Hier mein altes compilerunabhängiges Pack macro.
struct String {
    int size;
    char* data;
});

// Im Host:
String* string = lib_get_some_string();
dll_free_string(string);
</code></pre>
<p>Wie macht man das, &quot;wenn man weiß wie es gemacht wird&quot; <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>
</blockquote>
<p>Ich würde sagen: ziemlich genau so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415133</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Aug 2014 21:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Thu, 28 Aug 2014 02:00:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Boah, ey, du hast nichtmal gelesen was Tim06TR geschrieben hat, oder? Oder haperts echt am Verständnis?</p>
<p>Nein, pragma pack ist NICHT sinnlos.<br />
Weil man mit C-artigen Interfaces wunderbar verschiedenste Compiler mischen kann.</p>
<p>*facepalm*</p>
</blockquote>
<p>Mit dem falschen Fuss aufgestanden? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
a) gibt es Plattform ABIs, Compiler die sich nicht dran halten sind scheisse (hallo MSVC)<br />
b) ist es voelliger Bullshit, sich auf ein C Interface zu beschraenken<br />
c) kannst du mir nicht erzaehlen, dass es so unglaublich schwer ist, mit dem selben Compiler und Compilerflags wie der Anwendung zu kompilieren</p>
<p>such dir was aus, ist mir zu bloed bei dem ton</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415146</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 28 Aug 2014 02:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Thu, 28 Aug 2014 02:43:34 GMT]]></title><description><![CDATA[<p>Du hast vollkommen die Peilung verloren, oder?</p>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>ist mir zu bloed bei dem ton</p>
</blockquote>
<p>Und mir bei dem sagenhaften Unsinn den du verzapfst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415148</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 Aug 2014 02:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to DLL Datentypen on Thu, 28 Aug 2014 19:47:03 GMT]]></title><description><![CDATA[<p>Wieso sollte dann der Code mit den selben Libs nicht funzen? Er darf halt, wenn er einen anderen Compiler benutzt keine anderen Libs benutzen, sonst ist es ja klar, dass der Compiler evtl. falsche Offsets oder so benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415221</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Thu, 28 Aug 2014 19:47:03 GMT</pubDate></item></channel></rss>