<?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[Problem mit Auflösung virtueller Funktionen]]></title><description><![CDATA[<p>Hallo,<br />
ich würde mich nicht als Neuling in der Programmierung mit C++ bezeichnen, aber die tiefsten Feinheiten fehlen wohl doch noch. Ich hoffe jemand mit mehr Erfahrung kann folgendes Problem vielleicht auflösen:</p>
<p>In einem DLL-Projekt wird eine Klasse definiert, welche von mehreren Basisklassen erbt. Sowohl in den Basisklassen als auch in der Klasse selbst sind alle Methoden virtuell.</p>
<p>Zusätzlich enthält die DLL eine C-Funktion, welche eine Instanz der Klasse erzeugt und (gecastet als eine der Basisklassen zurückgibt).</p>
<p>Die DLL wird dynamisch geladen, die Funktion gesucht und verwendet, um eine Instanz der Klasse zu erstellen. Die Applikation, die das tut, nutzt die Header, sodass die Klassendefinition bekannt ist. Die Instanz wird damit zu einer Instanz der eigentlichen Klassen gecastet.</p>
<p>Nun das eigentliche Problem: Unter Visual Studio 2008 hat alles funktioniert. Nachdem die Applikation auf 2010 migriert ist, tritt folgender Fehler auf:</p>
<p>Beim Zugriff auf die virtuellen Memberfunktionen tritt eine Access-Violation auf, welche sich darauf zurückführen lässt, dass die VirtualFunctionTable einer der Basisklassen offensichtlich falsche Werte enthält.</p>
<p>Das kuriose daran ist, dass der Fehler nur in der Releaseversion der DLL auftritt. Außerdem ist er scheinbar Interpretationsabhängig (Wenn ich an der Stelle das Programm unterbreche und die Basisklasseninstanz mit der Schnellüberwachung betrachte, so sehe ich, dass so interpretiert, die richtigen Werte in der entsprechenden VFT stehen. Betrachte ich eine fertig gecastete Version der Instanz, so sind die Werte der Tabelle falsch).</p>
<p>In der Hoffnung, dass das jemand nachvollziehen kann, und vielleicht einen Hinweis hat noch ein Bisschen stellvertretender Quellcode.</p>
<p>DLL:</p>
<pre><code>class __declspec(dllexport) Klasse1
{
public:
virtual bool Initialize();
}

class __declspec(dllexport) Klasse2: public Klasse1
{
public:
virtual bool Initialize();
virtual void Methode1();
...
}

class __declspec(dllexport) Klasse3
{
...
}

class __declspec(dllexport) Klasse4: public Klasse2, public Klasse3
{
public:
...
virtual bool Initialize();
virtual void Methode1();
...
}

Klasse1* CreateObject()
{
  return (Klasse1*)new Klasse4();
}
</code></pre>
<p>Applikation:</p>
<pre><code>m_hDLL = ::LoadLibrary(filename);//DLL dynamisch laden
Create=(Klasse1*())::GetProcAddress(m_hDLL, &quot;CreateObject&quot;);//Funktion suchen
Klasse1* obj=Create();//und aufrufen, um Instanz zu erzeugen

obj-&gt;Initialize();//wird korrekt aufgelöst (da der Eintrag in der VFT von Klasse1 steht

((Klasse4)obj)-&gt;Methode1();//wird nicht korrekt aufgelöst (VFT für die Methoden der Basisklasse Klasse2 enthält ausschließlich falsche Einträge bzw. der Pointer auf die VFT selbst ist 0x00000000, also ungültig)
</code></pre>
<p>Hat vielleicht irgend jemand ähnliche Probleme bei der Migration, oder kommt jemandem so ein Verhalten anderweitig bekannt vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265767/problem-mit-auflösung-virtueller-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 18:28:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265767.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Apr 2010 14:24:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Wed, 28 Apr 2010 14:33:11 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich würde mich nicht als Neuling in der Programmierung mit C++ bezeichnen, aber die tiefsten Feinheiten fehlen wohl doch noch. Ich hoffe jemand mit mehr Erfahrung kann folgendes Problem vielleicht auflösen:</p>
<p>In einem DLL-Projekt wird eine Klasse definiert, welche von mehreren Basisklassen erbt. Sowohl in den Basisklassen als auch in der Klasse selbst sind alle Methoden virtuell.</p>
<p>Zusätzlich enthält die DLL eine C-Funktion, welche eine Instanz der Klasse erzeugt und (gecastet als eine der Basisklassen zurückgibt).</p>
<p>Die DLL wird dynamisch geladen, die Funktion gesucht und verwendet, um eine Instanz der Klasse zu erstellen. Die Applikation, die das tut, nutzt die Header, sodass die Klassendefinition bekannt ist. Die Instanz wird damit zu einer Instanz der eigentlichen Klassen gecastet.</p>
<p>Nun das eigentliche Problem: Unter Visual Studio 2008 hat alles funktioniert. Nachdem die Applikation auf 2010 migriert ist, tritt folgender Fehler auf:</p>
<p>Beim Zugriff auf die virtuellen Memberfunktionen tritt eine Access-Violation auf, welche sich darauf zurückführen lässt, dass die VirtualFunctionTable einer der Basisklassen offensichtlich falsche Werte enthält.</p>
<p>Das kuriose daran ist, dass der Fehler nur in der Releaseversion der DLL auftritt. Außerdem ist er scheinbar Interpretationsabhängig (Wenn ich an der Stelle das Programm unterbreche und die Basisklasseninstanz mit der Schnellüberwachung betrachte, so sehe ich, dass so interpretiert, die richtigen Werte in der entsprechenden VFT stehen. Betrachte ich eine fertig gecastete Version der Instanz, so sind die Werte der Tabelle falsch).</p>
<p>In der Hoffnung, dass das jemand nachvollziehen kann, und vielleicht einen Hinweis hat noch ein Bisschen stellvertretender Quellcode.</p>
<p>DLL:</p>
<pre><code>class __declspec(dllexport) Klasse1
{
public:
virtual bool Initialize();
}

class __declspec(dllexport) Klasse2: public Klasse1
{
public:
virtual bool Initialize();
virtual void Methode1();
...
}

class __declspec(dllexport) Klasse3
{
...
}

class __declspec(dllexport) Klasse4: public Klasse2, public Klasse3
{
public:
...
virtual bool Initialize();
virtual void Methode1();
...
}

Klasse1* CreateObject()
{
  return (Klasse1*)new Klasse4();
}
</code></pre>
<p>Applikation:</p>
<pre><code>m_hDLL = ::LoadLibrary(filename);//DLL dynamisch laden
Create=(Klasse1*())::GetProcAddress(m_hDLL, &quot;CreateObject&quot;);//Funktion suchen
Klasse1* obj=Create();//und aufrufen, um Instanz zu erzeugen

obj-&gt;Initialize();//wird korrekt aufgelöst (da der Eintrag in der VFT von Klasse1 steht

((Klasse4)obj)-&gt;Methode1();//wird nicht korrekt aufgelöst (VFT für die Methoden der Basisklasse Klasse2 enthält ausschließlich falsche Einträge bzw. der Pointer auf die VFT selbst ist 0x00000000, also ungültig)
</code></pre>
<p>Hat vielleicht irgend jemand ähnliche Probleme bei der Migration, oder kommt jemandem so ein Verhalten anderweitig bekannt vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889497</guid><dc:creator><![CDATA[Galatea]]></dc:creator><pubDate>Wed, 28 Apr 2010 14:33:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Wed, 28 Apr 2010 14:29:29 GMT]]></title><description><![CDATA[<p>Galatea schrieb:</p>
<blockquote>
<p>In einem DLL-Projekt wird eine Klasse definiert, ...<br />
Zusätzlich enthält die DLL eine C-Funktion, welche eine Instanz der Klasse erzeugt...</p>
</blockquote>
<p>1. DLLs gehören nicht zum C++ Standard (und sind Systemabhängig), daher ist dies hier eigentlich das falsche Forum.<br />
2. Da C++ keine Binärkompatibilität garantiert, müssen alle Projekte unter dem gleichen Compiler (inkl. Compilerversion) erstellt werden - sofern eine Klassenübergabe überhaupt möglich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889502</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 28 Apr 2010 14:29:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 07:45:24 GMT]]></title><description><![CDATA[<p>Also als erstes Danke für die schnelle Antwort, aber</p>
<ol>
<li>
<p>Dass das hier evtl. nicht das richtige Forum ist, hatte ich mir schon gedacht. Ein Hinweis auf eine bessere Wahl wäre allerdings nicht schlecht gewesen.</p>
</li>
<li>
<p>Ein Problem, welches sich direkt aus der Compilerwahl ergibt, kann es eigentlich nicht sein, da Release- und Debug-Versionen aus Sicht des Compilers ja eigentlich das selbe sind (abgesehen von einigen Flags, welche aber konfigurierbar sind) und wie bereits geschrieben funktioniert es ja mit Debugversion der DLL. Da ich den Compiler beider Projekte nicht verändern kann (Rahmenbedingungen) ist die einfachste Lösung also nicht praktikabel. Interessanter wäre, ob es Compilerschalter (typische Einstellungen eines Compilers unabhängig, ob es diese Option bei Microsoft gibt oder ob sie evtl. anders heißt) gibt, die derartiges Verhalten auslösen könnten.</p>
</li>
</ol>
<p>Falls dazu jemandem noch etwas einfallen würde, wäre ich über weiterführende Hilfe dankbar</p>
<p>iÜ: Falls dies jemand liest, der dazu berechtigt ist, das Thema an passendere Stelle zu verschieben, so kann derjenige das gerne tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889815</guid><dc:creator><![CDATA[Galatea]]></dc:creator><pubDate>Thu, 29 Apr 2010 07:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 10:12:49 GMT]]></title><description><![CDATA[<p>Erstmal kommt mir das hier falsch vor, da fehlt mir der Zeiger:</p>
<pre><code class="language-cpp">((Klasse4)obj)-&gt;Methode1();
</code></pre>
<p>sollte eher</p>
<pre><code class="language-cpp">((Klasse4*)obj)-&gt;Methode1();
</code></pre>
<p>sein. Das obige sollte sich aber auch nicht kompilieren lassen. Außerdem wäre nen dynamic-cast noch schön, da kannste auch prüfen, ob sich obj wirklich in Klasse4 überführen lässt (wirft bad_cast, wenn es sich nich umwandeln lässt)</p>
<p>Wenn es sich bei deinem Problem um nen Linker-Error handelt, hast du vermutlich die LIB-Datei der DLL nicht eingebunden?</p>
<p>SALOMON</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889868</guid><dc:creator><![CDATA[SALOMON]]></dc:creator><pubDate>Thu, 29 Apr 2010 10:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 10:21:41 GMT]]></title><description><![CDATA[<p>SALOMON schrieb:</p>
<blockquote>
<p>Außerdem wäre nen dynamic-cast noch schön, da kannste auch prüfen, ob sich obj wirklich in Klasse4 überführen lässt (wirft bad_cast, wenn es sich nich umwandeln lässt).</p>
</blockquote>
<p>Mein dynamic_cast gibt in dem Fall NULL zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889871</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 29 Apr 2010 10:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 10:28:11 GMT]]></title><description><![CDATA[<p>richtig so wars, hab mich vertan <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>
<p>EDIT: Hab gerade nomma nachgeschaut... bei Referenzen gibts nen bad_cast (weil auch logischerweise kein 0 zurückgegeben werden kann) und bei Zeigern ist es die 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889873</guid><dc:creator><![CDATA[SALOMON]]></dc:creator><pubDate>Thu, 29 Apr 2010 10:28:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 10:30:10 GMT]]></title><description><![CDATA[<p>Vermutlich führen deine C-Style Casts zu diesem Fehler. Ein C-Style Cast kann sich wie ein dynamic_cast verhalten, wenn alle entsprechenden Header vorher inkludiert wurden. Steht vorher aber nur so etwas wie &quot;class MeineKlasse;&quot;, wird wie in C gecastet, ohne die Adresse anzupassen (sofern nötig).<br />
Es ist also nicht möglich nur durch ansehen des Casts zu entscheiden, ob alles richtig gemacht wird.</p>
<p><strong>Grundsätzlich sollten in einem C++ Programm keine C-Style Casts verwendet werden.</strong></p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889874</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 29 Apr 2010 10:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 12:18:29 GMT]]></title><description><![CDATA[<p>Danke für eure Unterstützung, mein Problem lies sich damit so halbwegs lösen.</p>
<p>Der vergessene Pointer-Stern war natürlich ein Tippfehler im Posting.</p>
<p>Was das dynamische casting angeht, so verwende ich jetzt eine Mischung aus C-casts und dynamic_cast-Anweisungen. (Ist notwendig, da andernfalls zwar mein Zugriff auf die Basisklasse funktioniert, welche bisher versagt hat, dafür klappts bei reinem dynamic_cast bei den anderen nicht mehr)</p>
<p>Ist zwar keine schöne Lösung, aber so gehts wenigstens. In Zukunft werde ich dann darauf achten, mich soweit möglich an den dynamic_cast zu halten.</p>
<p>Also nochmals Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889923</guid><dc:creator><![CDATA[Galatea]]></dc:creator><pubDate>Thu, 29 Apr 2010 12:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 12:28:21 GMT]]></title><description><![CDATA[<p>Welche &quot;anderen&quot; Casts gehen nicht? dynamic_cast funktioniert nur bei abgeleiteten Typen also nur mit Downcasting. Sonst gibts da noch static_cast um sowas wie float in int zu konvertieren, const_cast um ein konstantes Objekt veränderbar zu machen und reinterpret_cast... wobei reinterpret_cast so ziehmlich alles frisst, wenn du einen Zeiger hast (z.B. void*) und den dann in einen Zeiger eines anderen Typs konvertieren willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889934</guid><dc:creator><![CDATA[SALOMON]]></dc:creator><pubDate>Thu, 29 Apr 2010 12:28:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 14:08:36 GMT]]></title><description><![CDATA[<p>Galatea schrieb:</p>
<blockquote>
<p>Was das dynamische casting angeht, so verwende ich jetzt eine Mischung aus C-casts und dynamic_cast-Anweisungen. (Ist notwendig, da andernfalls zwar mein Zugriff auf die Basisklasse funktioniert, welche bisher versagt hat, dafür klappts bei reinem dynamic_cast bei den anderen nicht mehr)</p>
</blockquote>
<p>Dann machst du etwas falsch. C-Style Casts sind nicht notwendig, es geht immer mit den C++ Casts.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889973</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 29 Apr 2010 14:08:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 14:13:25 GMT]]></title><description><![CDATA[<p>was ich meinte war ungefähr das folgende</p>
<pre><code>Klasse1* pClass1=CreateObject();//die zurückgegebene Instanz hat eigentlich den Typ Klasse4*

Klasse4* pClass4_C=(Klasse4*)pClass1;//C-Style cast zu Klasse4

pClass4_C-&gt;Initialize();//funktioniert
pClass4_C-&gt;Methode1();//funktioniert nicht

Klasse4* pClass4_Dyn=dynamic_cast&lt;Klasse4*&gt;(pClass1);//dynamisch gecastet

pClass4_Dyn-&gt;Initialize();//funktioniert nicht (die entsprechende vftable wird an der falschen Stelle gesucht)
dynamic_cast&lt;Klasse2*&gt;(pClass4_Dyn)-&gt;Methode1();//funktioniert auch nicht
pClass4_Dyn-&gt;Methode1();//funktioniert
</code></pre>
<p>ich vermute es liegt am internen Verhalten der DLL, was ich aber nicht wesentlich verändern kann. Ich halte mir deshalb beide Versionen des gecasteten Pointers und nutze jeweils diejenige, die funktioniert.</p>
<p>solltest du zufällig eine Idee haben, warum das einmal geht und das andere mal nicht, würde ich mich dennoch über einen Hinweis freuen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889975</guid><dc:creator><![CDATA[Galatea]]></dc:creator><pubDate>Thu, 29 Apr 2010 14:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 15:23:48 GMT]]></title><description><![CDATA[<p>Was soll der Cast eigentlich?</p>
<pre><code class="language-cpp">Klasse1* CreateObject()
{
  return (Klasse1*)new Klasse4();
}
</code></pre>
<p>Mach das mal so:</p>
<pre><code class="language-cpp">Klasse1* CreateObject()
{
  return new Klasse4;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1890004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890004</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Thu, 29 Apr 2010 15:23:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Thu, 29 Apr 2010 15:29:08 GMT]]></title><description><![CDATA[<p>Galatea schrieb:</p>
<blockquote>
<p>ich vermute es liegt am internen Verhalten der DLL, was ich aber nicht wesentlich verändern kann.</p>
</blockquote>
<p>Was mir noch immer nicht klar ist: Wurde die DLL mit der gleichen Compilerversion erzeugt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890006</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 29 Apr 2010 15:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Fri, 30 Apr 2010 08:37:50 GMT]]></title><description><![CDATA[<p>Ich habe keine Einflussmöglichkeiten auf den Quellcode in der DLL und auch nicht auf die verwendete Compilerversion (VC2008). In meinem Projekt (der &quot;Applikation&quot;) bin ich auf Grund von Rahmenbedingungen auf Visual Studio 2010 angewiesen, da auch das .Net Framework 4.0 zur Anwendung kommt. Also sind DLL und Applikation nicht mit der selben Compilerversion erstellt (und das lässt sich auch nicht ändern).</p>
<p>Was den scheinbar überflüssigen Cast angeht, so kann ich nicht beantworten, warum er verwendet wird. Ich kann lediglich bestätigen, dass er wirklich so im Quelltext steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890317</guid><dc:creator><![CDATA[Galatea]]></dc:creator><pubDate>Fri, 30 Apr 2010 08:37:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Fri, 30 Apr 2010 08:46:14 GMT]]></title><description><![CDATA[<p>Galatea schrieb:</p>
<blockquote>
<p>Also sind DLL und Applikation nicht mit der selben Compilerversion erstellt...</p>
</blockquote>
<p>Okay, dann erübrigt sich auch jeder Versuch einer Hilfe, da die Compilerversionen vermutlich eine inkompatible binäre Darstellung haben (Ein riesiges Manko von C++ ist die fehlende Binärkompatibilität).</p>
<p>Einzige Lösung die mir einfällt:<br />
Wrapper-DLL unter VS2008 schreiben, die alle Aufrufe in eine C-Schnittstelle umwandelt, den C-Schnittstellen sind im Gegensatz zu C++ Schnittstellen unproblematisch. Oder einen COM-Wrapper...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890323</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 30 Apr 2010 08:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Fri, 30 Apr 2010 12:07:23 GMT]]></title><description><![CDATA[<p>Wie ich bereits am Anfang beschrieben habe, kann das eigentlich nicht das Problem sein, da alles problemlos funktioniert, wenn ich die Debugversion der DLL verwende. Nur eine in der Releaseversion kompilierte DLL verursacht den Fehler, was mich zum Schluss kommen lässt, dass es ein Konfigurationsproblem bzw. ein Compilerschalter sein müsste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890392</guid><dc:creator><![CDATA[Galatea]]></dc:creator><pubDate>Fri, 30 Apr 2010 12:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Fri, 30 Apr 2010 12:23:26 GMT]]></title><description><![CDATA[<p>Galatea schrieb:</p>
<blockquote>
<p>Wie ich bereits am Anfang beschrieben habe, kann das eigentlich nicht das Problem sein, da alles problemlos funktioniert, wenn ich die Debugversion der DLL verwende. Nur eine in der Releaseversion kompilierte DLL verursacht den Fehler, was mich zum Schluss kommen lässt, dass es ein Konfigurationsproblem bzw. ein Compilerschalter sein müsste.</p>
</blockquote>
<p>Debug und Release Dateien sind oftmals unterschiedlich.<br />
Von daher kann es sein, dass du eine gesonderte DLL für den Releasebuild benötigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890400</guid><dc:creator><![CDATA[Walnut_Burl]]></dc:creator><pubDate>Fri, 30 Apr 2010 12:23:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Fri, 30 Apr 2010 12:26:55 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Galatea schrieb:</p>
<blockquote>
<p>Also sind DLL und Applikation nicht mit der selben Compilerversion erstellt...</p>
</blockquote>
<p>Okay, dann erübrigt sich auch jeder Versuch einer Hilfe, da die Compilerversionen vermutlich eine inkompatible binäre Darstellung haben (Ein riesiges Manko von C++ ist die fehlende Binärkompatibilität).</p>
<p>Einzige Lösung die mir einfällt:<br />
Wrapper-DLL unter VS2008 schreiben, die alle Aufrufe in eine C-Schnittstelle umwandelt, den C-Schnittstellen sind im Gegensatz zu C++ Schnittstellen unproblematisch. Oder einen COM-Wrapper...</p>
</blockquote>
<p>Mit Interfaces (Klasse mit nur rein virtuellen Methoden) ist die Interoperabilität auch zwischen verschiedenen Versionen eines Kompiler gegeben.<br />
(Siehe &quot;Imperfect C++&quot; von Matthew Willson).</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890404</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 30 Apr 2010 12:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Auflösung virtueller Funktionen on Fri, 30 Apr 2010 13:09:25 GMT]]></title><description><![CDATA[<p>Dass sich die Ausgabedateien bei Debug- und Releaseversion unterscheiden, ist mir klar. Soweit ich das bisher verstanden hatte, hängt das doch aber damit zusammen, dass jede Konfiguration einen eigenen Satz von (einstellbaren) Optionen hat. Würde man diese Optionen zwischen den Konfigurationen angleichen, so müsste nach meinem Verständnis das selbe Ergebnis rauskommen, da ja letztendlich in beiden Fällen der selbe Compiler verwendet wird - nur die angegebenen Compiler Switches unterscheiden sich. (wobei hier mit Compiler nicht das Entwicklungswerkzeug, sondern die Anwendung (vcbuild.exe oder so ähnlich) selbst gemeint ist)</p>
<p>Irre ich mich darin denn grundlegend?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890431</guid><dc:creator><![CDATA[Galatea]]></dc:creator><pubDate>Fri, 30 Apr 2010 13:09:25 GMT</pubDate></item></channel></rss>