<?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[[solved] Dynamisch eingebundene DLL schmeißt exceptions.]]></title><description><![CDATA[<p>Ich möchte mein Programm zur Laufzeit mit neuen DLLs versorgen, um beliebig Inhalt durch neue Methoden hinzuzufügen.</p>
<p>Das Laden der DLL funktioniert, nur irgendwie funktioniert das benutzen der entsprechend implementierte Funktionen nicht.</p>
<p>So lade ich die DLL und führe exemplarisch eine Funktion aus, die eine exception wirft:</p>
<pre><code>Unbehandelte Ausnahme bei 0x000007FEE346309D (msvcp110d.dll) in Prog.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xFFFFFFFFFFFFFFFF
</code></pre>
<pre><code>HMODULE					hDLL;
    DllClassGetFunction     fGet;
	funct					fMeth;
    StrategyInterface		*cClass;

	hDLL = LoadLibrary(getLPCWFromStr(&quot;Extra.dll&quot;).c_str()); // Funktioniert, hDLL ist nicht null.

    if(hDLL == NULL)  {
		return ErrType::Failure;
    }
    fGet = (DllClassGetFunction)(GetProcAddress(hDLL,&quot;getClass&quot;));	// Funktion wird auch gefunden.
    if(fGet == NULL) {

		return ErrType::Failure;

    } else {
		StrategyInterface* bla = fGet();
		bla-&gt;getStrategyName();		// hier gibt es einen Fehler.
		return ErrType::Success;
	}
</code></pre>
<p>Sowohl das ausführende Programm sowie das Projekt mit dem ich die dlls erstelle haben die gleichen Interface header:</p>
<pre><code>class StrategyInterface {
	public:
		virtual				~StrategyInterface(){}
		virtual _ErrType	method(vector&lt;StreamDataBlock&gt;* scope, StreamPlotable* sPlotable) = 0;
		virtual string		getStrategyName() = 0;
		virtual string		getStrategyBrief() = 0;

		void				assignCaption		(StreamSubDataBlock* sSDB, SubStreamPlotable* sSP);
		void				saveLargerNum		(_u32&amp; dest, _u32 comp);
		void				saveSmalerNum		(_u32&amp; dest, _u32 comp);
};
</code></pre>
<p>Und das hier ist der Code zum erstellen der DLL:</p>
<pre><code>class Strategy : public StrategyInterface {
public:
	ErrType method(vector&lt;StreamDataBlock&gt;* scope, StreamPlotable* sPlotable) {
		return ErrType::Success;
	}

	string		getStrategyName() {
		return &quot;blubb&quot;;
	}
	string		getStrategyBrief() {
		return &quot;bla&quot;;
	}

};

#define STRATEGYDLL_API __declspec(dllexport)

BOOL APIENTRY DllMain(HMODULE hModule, 
                      DWORD dwReasonForCall, 
                      LPVOID pReserved)
{
    switch(dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }

    return TRUE;
}

extern &quot;C&quot;
STRATEGYDLL_API Strategy*	getClass() {
	return new Strategy;
}
</code></pre>
<p>Wenn ich mit dem pointer den ich von fGet() bekomme eine der nicht virtuellen Funktionen aus dem Interface aufrufe funktioniert alles.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325370/solved-dynamisch-eingebundene-dll-schmeißt-exceptions</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 13:24:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325370.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Apr 2014 13:24:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Sat, 03 May 2014 08:04:22 GMT]]></title><description><![CDATA[<p>Ich möchte mein Programm zur Laufzeit mit neuen DLLs versorgen, um beliebig Inhalt durch neue Methoden hinzuzufügen.</p>
<p>Das Laden der DLL funktioniert, nur irgendwie funktioniert das benutzen der entsprechend implementierte Funktionen nicht.</p>
<p>So lade ich die DLL und führe exemplarisch eine Funktion aus, die eine exception wirft:</p>
<pre><code>Unbehandelte Ausnahme bei 0x000007FEE346309D (msvcp110d.dll) in Prog.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xFFFFFFFFFFFFFFFF
</code></pre>
<pre><code>HMODULE					hDLL;
    DllClassGetFunction     fGet;
	funct					fMeth;
    StrategyInterface		*cClass;

	hDLL = LoadLibrary(getLPCWFromStr(&quot;Extra.dll&quot;).c_str()); // Funktioniert, hDLL ist nicht null.

    if(hDLL == NULL)  {
		return ErrType::Failure;
    }
    fGet = (DllClassGetFunction)(GetProcAddress(hDLL,&quot;getClass&quot;));	// Funktion wird auch gefunden.
    if(fGet == NULL) {

		return ErrType::Failure;

    } else {
		StrategyInterface* bla = fGet();
		bla-&gt;getStrategyName();		// hier gibt es einen Fehler.
		return ErrType::Success;
	}
</code></pre>
<p>Sowohl das ausführende Programm sowie das Projekt mit dem ich die dlls erstelle haben die gleichen Interface header:</p>
<pre><code>class StrategyInterface {
	public:
		virtual				~StrategyInterface(){}
		virtual _ErrType	method(vector&lt;StreamDataBlock&gt;* scope, StreamPlotable* sPlotable) = 0;
		virtual string		getStrategyName() = 0;
		virtual string		getStrategyBrief() = 0;

		void				assignCaption		(StreamSubDataBlock* sSDB, SubStreamPlotable* sSP);
		void				saveLargerNum		(_u32&amp; dest, _u32 comp);
		void				saveSmalerNum		(_u32&amp; dest, _u32 comp);
};
</code></pre>
<p>Und das hier ist der Code zum erstellen der DLL:</p>
<pre><code>class Strategy : public StrategyInterface {
public:
	ErrType method(vector&lt;StreamDataBlock&gt;* scope, StreamPlotable* sPlotable) {
		return ErrType::Success;
	}

	string		getStrategyName() {
		return &quot;blubb&quot;;
	}
	string		getStrategyBrief() {
		return &quot;bla&quot;;
	}

};

#define STRATEGYDLL_API __declspec(dllexport)

BOOL APIENTRY DllMain(HMODULE hModule, 
                      DWORD dwReasonForCall, 
                      LPVOID pReserved)
{
    switch(dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }

    return TRUE;
}

extern &quot;C&quot;
STRATEGYDLL_API Strategy*	getClass() {
	return new Strategy;
}
</code></pre>
<p>Wenn ich mit dem pointer den ich von fGet() bekomme eine der nicht virtuellen Funktionen aus dem Interface aufrufe funktioniert alles.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396647</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Sat, 03 May 2014 08:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Tue, 29 Apr 2014 11:31:37 GMT]]></title><description><![CDATA[<p>niemand eine idee woran das liegt?</p>
<p>ich hab noch etwas anderes getestet:</p>
<pre><code>virtual int			bla(int* a) = 0; // diese funktion habe ich dem Interface hinzugefügt.
</code></pre>
<pre><code>int			bla(int* a) {
		int b = (*a) + 1;
		return b; // und so in der dll implementiert.
	}
</code></pre>
<p>Diese Funktion lässt sich auffrufen...<br />
gibt aber ein fehlerhaftes ergebnis zurück.<br />
Muss man irgendetwas mit pointern und dlls beachten?<br />
Ich versteh vorallem nicht wieso es nicht klappt. Eigentlich müsste ich doch einfach eine Instanz dieser Klasse bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396757</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Tue, 29 Apr 2014 11:31:37 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Tue, 29 Apr 2014 11:59:22 GMT]]></title><description><![CDATA[<p>[quote=&quot;cl90&quot;]niemand eine idee woran das liegt?[(quote]<br />
Wenn fGet() so ist wie bla(), ist der Fehler sonneklar.</p>
<p>Aber nicht klar ist, wie man Dir beibringt, erstmal ein gutes C++-Buch (vielleicht nicht Wolf, P&amp;P, M+T, …Kompenium, …in 10 Tagen) ganz durchzulesen und ein klitzewenig C++ zu lernen, *bevor* Du ein Game proggers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396760</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 29 Apr 2014 11:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Tue, 29 Apr 2014 12:02:16 GMT]]></title><description><![CDATA[<p>DLL und Dein Programm sind mit demselben Compiler und denselben Einstellungen erstellt?</p>
<p>Ansonsten ist es keine gute Idee Instanzen von Klassen als Parameter oder Rückgabewerte von Funktionen zu verwenden.<br />
Nicht umsonst verwendet die WinApi nur structs unds Char-Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396761</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Tue, 29 Apr 2014 12:02:16 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Tue, 29 Apr 2014 13:40:40 GMT]]></title><description><![CDATA[<p>Er reicht doch da nur Zeiger rum!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396767</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 29 Apr 2014 13:40:40 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Tue, 29 Apr 2014 13:52:16 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Aber nicht klar ist, wie man Dir beibringt, erstmal ein gutes C++-Buch (vielleicht nicht Wolf, P&amp;P, M+T, …Kompenium, …in 10 Tagen) ganz durchzulesen und ein klitzewenig C++ zu lernen, *bevor* Du ein Game proggers.</p>
</blockquote>
<p>Hättest du wenigstens den Post gelesen bevor du so überflüssige Kommentare abgibst wär dir nicht nur klar geworden das fGet() nicht so aussieht, und wir hätten uns dein MiMi erspaart.<br />
Du bist wohl perfekt geboren worden hm?<br />
Und wer sagt das es um ein bescheuertes Spiel geht.</p>
<p>MichelRT schrieb:</p>
<blockquote>
<p>DLL und Dein Programm sind mit demselben Compiler und denselben Einstellungen erstellt?</p>
</blockquote>
<p>Ja. Beide MSVC2012 beide x64 eingestellt. Muss wirklich alles exakt gleich sein? Könnte Multibytezeichensatz soetwas auch beinflussen? also muss ich wirklich jede Projekteinstellung durchsehen?</p>
<p>MichelRT schrieb:</p>
<blockquote>
<p>Ansonsten ist es keine gute Idee Instanzen von Klassen als Parameter oder Rückgabewerte von Funktionen zu verwenden.<br />
Nicht umsonst verwendet die WinApi nur structs unds Char-Zeiger.</p>
</blockquote>
<p>Ok.. Jemand hatte mir erzählt es wäre durchaus gängig ganze Klassen aus Dlls zu holen. Gibt es denn andere Wege Klassen dynamisch in ein Programm zu kriegen? Also um ein Nachrüsten von Funktionen zu ermöglichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396770</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Tue, 29 Apr 2014 13:52:16 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Tue, 29 Apr 2014 14:57:01 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Er reicht doch da nur Zeiger rum!?</p>
</blockquote>
<p>Er reicht einen Zeiger auf ein Interface herum.<br />
Mit dem Zeiger ruft er eine Methode auf -&gt; Bumm.<br />
Da liegt doch die Vermutung nahe, dass das aufrufende Progamm irgendwie das auf das der Zeiger zeigt falsch interpretiert <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="😃"
    /></p>
<p>Deswegen meine Frage nach Compiler und Compilereinstellungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396774</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Tue, 29 Apr 2014 14:57:01 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 05:10:13 GMT]]></title><description><![CDATA[<p>MichelRT schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Er reicht doch da nur Zeiger rum!?</p>
</blockquote>
<p>Er reicht einen Zeiger auf ein Interface herum.<br />
Mit dem Zeiger ruft er eine Methode auf -&gt; Bumm.<br />
Da liegt doch die Vermutung nahe, dass das aufrufende Progamm irgendwie das auf das der Zeiger zeigt falsch interpretiert <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="😃"
    /></p>
<p>Deswegen meine Frage nach Compiler und Compilereinstellungen.</p>
</blockquote>
<p>Exakt. Aber ich habe keine Ahnung was ich dagegen tun kann...<br />
Ich habe jetzt mal in den sourcecode der DLL reinDebugt. Der Pointer den ich z.b. an die Funktion bla(int* a) übergebe, wird völlig woanders auf den stack gelegt...<br />
Auf der aufrufenden Seite hat der Zeiger eine ganz andere Adresse als in der DLL selbst.</p>
<p>Muss ich mein _StrategyInterface im aufrufendem programm auch mit den Tags wie (__declspec(dllimport)) versehen?</p>
<p>Kann es vlt sein das die Funktionspointer die ich über &quot;fGet = (DllClassGetFunction)(GetProcAddress(hDLL,&quot;getClass&quot;));&quot; hole irgendwie quatsch sind?</p>
<p>Muss das Klassen Interface zu 100% Abstrakt sein? oder darf ich da wie jetzt auch vor definierte funktionen drin haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396826</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Wed, 30 Apr 2014 05:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 05:50:04 GMT]]></title><description><![CDATA[<p>MichelRT schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Er reicht doch da nur Zeiger rum!?</p>
</blockquote>
<p>Er reicht einen Zeiger auf ein Interface herum.<br />
Mit dem Zeiger ruft er eine Methode auf -&gt; Bumm.<br />
Da liegt doch die Vermutung nahe, dass das aufrufende Progamm irgendwie das auf das der Zeiger zeigt falsch interpretiert <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="😃"
    /></p>
<p>Deswegen meine Frage nach Compiler und Compilereinstellungen.</p>
</blockquote>
<p>Mein Zwischenruf bezog sich auf den Hinweis &quot; keine gute Idee <strong>Instanzen</strong> von Klassen als Parameter oder Rückgabewerte von Funktionen zu verwenden.&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396829</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 30 Apr 2014 05:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 10:46:35 GMT]]></title><description><![CDATA[<p>Bei mir funktioniert's:</p>
<pre><code>// DLL
class StrategyInterface {
public:
    virtual             ~StrategyInterface(){}
    virtual string      getStrategyName() = 0;
    virtual string      getStrategyBrief() = 0;
};
class Strategy : public StrategyInterface {
public: 
    string      getStrategyName() {
        return &quot;blubb&quot;;
    }
    string      getStrategyBrief() {
        return &quot;bla&quot;;
    }

};
#define STRATEGYDLL_API __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD dwReasonForCall,
                      LPVOID pReserved)
{
    switch(dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
extern &quot;C&quot;
STRATEGYDLL_API Strategy*   getClass() {
    return new Strategy;
}
</code></pre>
<pre><code>// exe
class StrategyInterface {
public:
    virtual             ~StrategyInterface(){}
    virtual string      getStrategyName() = 0;
    virtual string      getStrategyBrief() = 0;
};
typedef StrategyInterface*(__stdcall *getClass)(void);
int main()
{
    HMODULE                 hDLL;
    getClass                fGet;
    StrategyInterface       *cClass;

    hDLL = LoadLibraryA(&quot;VTableTest.dll&quot;); // Funktioniert, hDLL ist nicht null.

    if(hDLL == NULL)
	{
        MessageBoxA(NULL, &quot;Can't load library!&quot;, &quot;Error&quot;, NULL);
    }
    fGet = (getClass)(GetProcAddress(hDLL,&quot;getClass&quot;));  // Funktion wird auch gefunden.
    if(fGet == NULL)
	{
        MessageBoxA(NULL, &quot;Can't get process address!&quot;, &quot;Error&quot;, NULL);
    }
	else
	{
        StrategyInterface* bla = fGet();
        std::cout &lt;&lt; bla-&gt;getStrategyName() &lt;&lt; std::endl;     // hier gibt es einen Fehler.
    }
	system(&quot;pause&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396849</guid><dc:creator><![CDATA[asdffdaöshge]]></dc:creator><pubDate>Wed, 30 Apr 2014 10:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 12:50:18 GMT]]></title><description><![CDATA[<p>okay... vielen Dank dafür das du es mal getestet hast!<br />
Du hast zwar nur die vereinfachte Version getestet aber vom Ding her müsste es also funktionieren.<br />
Ich werd das gleich mal auch in der vereinfachten Version testen und dann schauen wo da bei mir der wurm drin ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396860</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Wed, 30 Apr 2014 12:50:18 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 13:54:07 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>MichelRT schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Er reicht doch da nur Zeiger rum!?</p>
</blockquote>
<p>Er reicht einen Zeiger auf ein Interface herum.<br />
Mit dem Zeiger ruft er eine Methode auf -&gt; Bumm.<br />
Da liegt doch die Vermutung nahe, dass das aufrufende Progamm irgendwie das auf das der Zeiger zeigt falsch interpretiert <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="😃"
    /></p>
<p>Deswegen meine Frage nach Compiler und Compilereinstellungen.</p>
</blockquote>
<p>Mein Zwischenruf bezog sich auf den Hinweis &quot; keine gute Idee <strong>Instanzen</strong> von Klassen als Parameter oder Rückgabewerte von Funktionen zu verwenden.&quot;</p>
</blockquote>
<p>Und mein Einwurf bezog sich auf Methoden und funktionen einer DLL.<br />
Klar darf man sonst Objekte als Parameter oder Rückgabewerte verwenden. <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396867</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Wed, 30 Apr 2014 13:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 14:04:32 GMT]]></title><description><![CDATA[<p>Lass mal den</p>
<pre><code>typedef DllClassGetFunction
</code></pre>
<p>sehen.<br />
Wenn da nicht so wie im vereinfachten Beispiel von asdfghjklöäqwert der stdcall steht dann ist es logisch dass Du Müll auf dem Stack siehst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396869</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Wed, 30 Apr 2014 14:04:32 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 16:36:14 GMT]]></title><description><![CDATA[<p>Ja, aber er reicht ja keine Instanzen (Objekte) herum, sondern lediglich Zeiger auf solche. Und das sollte meiner Meinung nach auch zwischen Client einer DLL und DLL keine Probleme bereiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396894</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 30 Apr 2014 16:36:14 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 16:43:08 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Ja, aber er reicht ja keine Instanzen (Objekte) herum, sondern lediglich Zeiger auf solche. Und das sollte meiner Meinung nach auch zwischen Client einer DLL und DLL keine Probleme bereiten.</p>
</blockquote>
<p>Naja, wenn Compiler A den vtable einer Klasse vor das Objekt packt und Compiler B ans Ende und dann in B eine DLL aus A geladen wird und versucht eine virtuelle Funktion aufzurufen....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396896</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 30 Apr 2014 16:43:08 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 17:25:08 GMT]]></title><description><![CDATA[<p>Sollte die V-Table nicht immer am selben Ort sein? Steht doch bestimmt in der Spezifikation, sonst hätte man das Problem unnötiger weiße bei anderen Versuchen Libs einzubinden ja auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396903</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Wed, 30 Apr 2014 17:25:08 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 18:05:30 GMT]]></title><description><![CDATA[<p>Mr.Long schrieb:</p>
<blockquote>
<p>Sollte die V-Table nicht immer am selben Ort sein? Steht doch bestimmt in der Spezifikation, sonst hätte man das Problem unnötiger weiße bei anderen Versuchen Libs einzubinden ja auch.</p>
</blockquote>
<p>Soweit ich weis hat C++ keine einheitliche ABI, Microsoft hat allerdings durch COM einen quasi - Standard etabliert (also nicht für die komplette ABI sondern nur für die v-Table).</p>
<p>floorball</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396909</guid><dc:creator><![CDATA[floorball]]></dc:creator><pubDate>Wed, 30 Apr 2014 18:05:30 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 18:12:25 GMT]]></title><description><![CDATA[<p>Unter was ordnet man dann __stdcall, __fastcall usw. ein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396910</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Wed, 30 Apr 2014 18:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 18:17:20 GMT]]></title><description><![CDATA[<p>calling conventions, stammt aus C</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396911</guid><dc:creator><![CDATA[floorball]]></dc:creator><pubDate>Wed, 30 Apr 2014 18:17:20 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 18:33:59 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Ja, aber er reicht ja keine Instanzen (Objekte) herum, sondern lediglich Zeiger auf solche. Und das sollte meiner Meinung nach auch zwischen Client einer DLL und DLL keine Probleme bereiten.</p>
</blockquote>
<p>Naja, wenn Compiler A den vtable einer Klasse vor das Objekt packt und Compiler B ans Ende und dann in B eine DLL aus A geladen wird und versucht eine virtuelle Funktion aufzurufen....</p>
</blockquote>
<p>Ist das denn wirklich so schwer zu verstehen?</p>
<p>MichelRT schrieb:</p>
<blockquote>
<p>Ansonsten ist es keine gute Idee Instanzen von Klassen als Parameter oder Rückgabewerte von Funktionen zu verwenden.</p>
</blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Ja, aber er reicht ja keine Instanzen (Objekte) herum, sondern lediglich Zeiger auf solche.</p>
</blockquote>
<p>Was ist daran auszusetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396913</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 30 Apr 2014 18:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Wed, 30 Apr 2014 19:38:27 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Ja, aber er reicht ja keine Instanzen (Objekte) herum, sondern lediglich Zeiger auf solche. Und das sollte meiner Meinung nach auch zwischen Client einer DLL und DLL keine Probleme bereiten.</p>
</blockquote>
<p>Naja, wenn Compiler A den vtable einer Klasse vor das Objekt packt und Compiler B ans Ende und dann in B eine DLL aus A geladen wird und versucht eine virtuelle Funktion aufzurufen....</p>
</blockquote>
<p>Ist das denn wirklich so schwer zu verstehen?</p>
</blockquote>
<p>Genau dasselbe Problem ist auch mit Pointern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396918</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 30 Apr 2014 19:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Thu, 01 May 2014 16:56:45 GMT]]></title><description><![CDATA[<p>Der sieht tatsächlich genauso aus wie der von ihm.</p>
<pre><code>typedef StrategyInterface*(__stdcall *getClass)(void);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2397004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397004</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Thu, 01 May 2014 16:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Fri, 02 May 2014 06:00:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29873">@Nathan</a>:<br />
Von verschiedenen Compilern war aber doch erst später die Rede. Zum Zeitpunkt meines Einwurfs hatte MichelRT darauf hingewiesen, dass man keine Objektinstanzen herumreichen soll und ich habe bemerkt, dass der TE das ja auch gar nicht tut.</p>
<p>Dass für die DLL und die Anwendung derselbe Compiler verwendet wird, hat der TE auch schon (längst) erklärt:</p>
<p>MichelRT schrieb:</p>
<blockquote>
<p>DLL und Dein Programm sind mit demselben Compiler und denselben Einstellungen erstellt?</p>
<p>cl90 schrieb:</p>
<blockquote>
<p>Ja. Beide MSVC2012 beide x64 eingestellt.</p>
</blockquote>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2397051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397051</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 02 May 2014 06:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Fri, 02 May 2014 11:55:06 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29873">@Nathan</a>:<br />
Von verschiedenen Compilern war aber doch erst später die Rede. Zum Zeitpunkt meines Einwurfs hatte MichelRT darauf hingewiesen, dass man keine Objektinstanzen herumreichen soll und ich habe bemerkt, dass der TE das ja auch gar nicht tut.</p>
</blockquote>
<p>Ja, aber ich wollte lediglich klar stellen, dass das komplett egal ist, ob es Zeiger oder Instanzen sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397086</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 02 May 2014 11:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Fri, 02 May 2014 12:24:19 GMT]]></title><description><![CDATA[<p>Wie findet denn der Compiler die Adressen der Funktionen aus der DLL nur anhand des Headers?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397089</guid><dc:creator><![CDATA[JulianH]]></dc:creator><pubDate>Fri, 02 May 2014 12:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to [solved] Dynamisch eingebundene DLL schmeißt exceptions. on Sat, 03 May 2014 06:58:56 GMT]]></title><description><![CDATA[<p>Okay.... Was genau hast du gemacht &quot;asdffdaöshge&quot; ?</p>
<p>bei mir funktioniert dein EXAKTER code nicht. er wirft die gleichen Fehler wie vorher.</p>
<p>Das hier ist der Vollständige ungekürzte Code:</p>
<p>DLL erstellen:</p>
<pre><code>#include &lt;string&gt;
#include &lt;Windows.h&gt;

using namespace std;

	// DLL
class StrategyInterface {
public:
    virtual             ~StrategyInterface(){}
    virtual string      getStrategyName() = 0;
    virtual string      getStrategyBrief() = 0;
};
class Strategy : public StrategyInterface {
public:
    string      getStrategyName() {
        return &quot;blubb&quot;;
    }
    string      getStrategyBrief() {
        return &quot;bla&quot;;
    }

};
#define STRATEGYDLL_API __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD dwReasonForCall,
                      LPVOID pReserved)
{
    switch(dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
extern &quot;C&quot;
STRATEGYDLL_API Strategy*   getClass() {
    return new Strategy;
}
</code></pre>
<p>Dll Lesen</p>
<pre><code>#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;Windows.h&gt;

using namespace std;

// exe
class StrategyInterface {
public:
    virtual             ~StrategyInterface(){}
    virtual string      getStrategyName() = 0;
    virtual string      getStrategyBrief() = 0;
};
typedef StrategyInterface*(__stdcall *getClass)(void);
int main()
{
    HMODULE                 hDLL;
    getClass                fGet;
    StrategyInterface       *cClass;

    hDLL = LoadLibraryA(&quot;D:\\testDll.dll&quot;); // Funktioniert, hDLL ist nicht null.

    if(hDLL == NULL)
    {
        MessageBoxA(NULL, &quot;Can't load library!&quot;, &quot;Error&quot;, NULL);
    }
    fGet = (getClass)(GetProcAddress(hDLL,&quot;getClass&quot;));  // Funktion wird auch gefunden.
    if(fGet == NULL)
    {
        MessageBoxA(NULL, &quot;Can't get process address!&quot;, &quot;Error&quot;, NULL);
    }
    else
    {
        StrategyInterface* bla = fGet();
        std::cout &lt;&lt; bla-&gt;getStrategyName() &lt;&lt; std::endl;     // hier gibt es einen Fehler.
    }
    system(&quot;pause&quot;);
}
</code></pre>
<p>edit:<br />
Getestet mit 32Bit compiler und mit x64. Beide mal wirft er die Exception beim Aufrufen der string Funktion.<br />
vlt wirds langsam relevant was für ein System ich hab...</p>
<p>Win7 x64, mit MSVC 2010</p>
<p>edit2:<br />
... in Zwei völlig neuen Projekten funktioniert der Sourcecode.<br />
Ich beginne die Einstellungsfehlersuche <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397194</guid><dc:creator><![CDATA[cl90]]></dc:creator><pubDate>Sat, 03 May 2014 06:58:56 GMT</pubDate></item></channel></rss>