<?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[Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen?]]></title><description><![CDATA[<p>Hallo allerseits.<br />
Ich hätte da eine Frage:<br />
Ist es möglich, von einer shared library aus auf Funktionen im aufrufenden Programm zuzugreifen?<br />
Ich frage aus folgendem Grund: Ich habe eine Mittelgroße Applikation, die durch shared libraries erweiterbar sein soll. Nun bekommt die library von der applikation zur laufzeit bestimmte objekte übergeben. Die library kennt die funktionen der hauptapplikation und damit auch der eingesetzten objekte ja zur linkzeit nicht und spuckt daher linker fehler aus. Ich könnte jetzt natürlich einen großteil meiner Applikation noch einmal als statische library machen und auf die dynamische linken, damit die Funktionen verfügbar sind, was aber die shared library ja nur sinnlos vergrößern würde (die funktionen sind zur laufzeit ja dann im hauptprogramm vorhanden).</p>
<p>Ich hoffe, man versteht mein Anliegen <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>Grüße<br />
Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155172/mit-shared-libs-auf-funktionen-im-hauptprogramm-zugreifen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 06:20:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155172.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Aug 2006 10:39:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 10:39:25 GMT]]></title><description><![CDATA[<p>Hallo allerseits.<br />
Ich hätte da eine Frage:<br />
Ist es möglich, von einer shared library aus auf Funktionen im aufrufenden Programm zuzugreifen?<br />
Ich frage aus folgendem Grund: Ich habe eine Mittelgroße Applikation, die durch shared libraries erweiterbar sein soll. Nun bekommt die library von der applikation zur laufzeit bestimmte objekte übergeben. Die library kennt die funktionen der hauptapplikation und damit auch der eingesetzten objekte ja zur linkzeit nicht und spuckt daher linker fehler aus. Ich könnte jetzt natürlich einen großteil meiner Applikation noch einmal als statische library machen und auf die dynamische linken, damit die Funktionen verfügbar sind, was aber die shared library ja nur sinnlos vergrößern würde (die funktionen sind zur laufzeit ja dann im hauptprogramm vorhanden).</p>
<p>Ich hoffe, man versteht mein Anliegen <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>Grüße<br />
Florian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109781</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Thu, 03 Aug 2006 10:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 11:54:29 GMT]]></title><description><![CDATA[<p>Also in C/C++ hätte man die Möglichkeit Funktionspointer zu machen. Man könnte somit den Objekten aus der Library Funktionen als Pointer übergeben, welche die Objekte aus der Library dann aufrufen könnten.</p>
<p>Zu Funktionspointer in C/C++:<br />
<a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109848</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 03 Aug 2006 11:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 13:02:53 GMT]]></title><description><![CDATA[<p>Unter Linux/Unix sollte dir das RTLD_GLOBAL-Flag bei <a href="http://man.cx/dlopen(2)" rel="nofollow">man: dlopen(2)</a> weiterhelfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109903</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Thu, 03 Aug 2006 13:02:53 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 13:23:38 GMT]]></title><description><![CDATA[<p>hm, gibt es sowas auch unter Windows? und wie verhinder ich dann, dass der compiler beim kompilieren der .so/.dll über die fehlenden referenzen meckert?</p>
<p>Ich will auch nochmal etwas näher in die Details gehen, dass ich noch etwas besser verstanden werde. (ich rede hier mal von dll statt shared library)</p>
<p>Also, ich habe zum einen die Hauptanwendung und die DLL. Die Hauptanwendung hat ein Objekt vom der Klasse Client. Diese Klasse hat verschiedene Methoden und Attribute. Dann wird die DLL vom Hauptprogramm dynamisch zur laufzeit geladen und eine Funktion der DLL aufgerufen. Dieser Funktion wird ein Pointer auf das Client-Objekt übergeben. Die DLL soll jetzt auf die Methoden des Client-Objektes Zugreifen können, OHNE, dass die entsprechenden Methoden beim Kompilieren der DLL mit ringelinkt wurden.<br />
Das würde zum einen die DLL verkleinern, weil die Methoden dann nur einmal vorhanden sind (im Hauptprogramm), statt in beiden Teilen und würde auch die Wartung vereinfachen, weil man die Methode nur noch im Hauptprogramm ändern muss, aber nicht mehr in den DLLs.</p>
<p>Mit Funktionspointern bzw. Funktors hab ich auch schon überlegt, aber das währe ein extremer Aufwand, wenn das Hauptprogramm viele Objekte mit vielen Methoden zur Verfügung stellt, gibt es da auch was komfortableres?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109923</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Thu, 03 Aug 2006 13:23:38 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 14:02:11 GMT]]></title><description><![CDATA[<p>hallo, eigentlich sollte es reichen, wenn du die methoden von Client alle virtuell machst.</p>
<p>du musst dann in der dll natürlich die header-datei includen.</p>
<p>die implementierung der methoden kann dann aber in dem hauptprogramm liegen.</p>
<p>wenigstens klappt das bei mir so, das geht dann auch zwischen dlls untereinander.</p>
<p>ciao,<br />
jenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109967</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Thu, 03 Aug 2006 14:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 14:02:23 GMT]]></title><description><![CDATA[<p>So wie du eine dll laden kannst kannst du auch eine exe laden, kommt aufs gleiche raus, musst die Funktionen nur exportieren, dann kann man sie aus der dll heraus laden. Ob du eine exe statisch (im Sinne von __declspec( dllexport/dllimport ) zur dll linken kannst, kann ich dir jetzt nicht sagen, aber im Zeifelsfall kannst es ja dynamisch machen (ist eh besser, dann kannst du bessere Fehlermeldungen ausgeben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109968</guid><dc:creator><![CDATA[Dr. Prof]]></dc:creator><pubDate>Thu, 03 Aug 2006 14:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 14:19:17 GMT]]></title><description><![CDATA[<p>Danke jenz, ich glaube, das war genau die lösung, die ich gesucht habe. Weis zwar noch nicht, ob das so funktioniert, wie ich es mir vorstelle, weil ich das erst morgen ausprobieren kann, aber es linkt jetzt zumindest auch ohne implementierung.</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109979</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Thu, 03 Aug 2006 14:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 14:41:48 GMT]]></title><description><![CDATA[<p>Du schreibst ne mittelgroße Applikation und weißt sowas nicht?<br />
Das wird was für <a href="http://thedailywtf.com" rel="nofollow">thedailywtf.com</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109996</guid><dc:creator><![CDATA[Lolz]]></dc:creator><pubDate>Thu, 03 Aug 2006 14:41:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Thu, 03 Aug 2006 17:53:07 GMT]]></title><description><![CDATA[<p>Eine für mich mittelgroße Applikation <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="🙂"
    /> (eigendlich sogar bis jetzt meine größte).</p>
<p>Ich wusste bis jetzt durchaus, was virtuelle Methoden sind, aber ich wusste nicht, dass das auch geht ohne den code zu kennen, der später da rein kommt <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/1110119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110119</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Thu, 03 Aug 2006 17:53:07 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Fri, 04 Aug 2006 07:05:49 GMT]]></title><description><![CDATA[<p>Hm, irgendwie will das bei mir nicht <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>
<p>Ich habe jetzt die Methoden virtuell gemacht und die dll linkt auch, aber sobald ich aus der DLL heraus eine der Methoden aufrufen will stürzt mir das Programm ab <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/1110300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110300</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Fri, 04 Aug 2006 07:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Fri, 04 Aug 2006 10:07:50 GMT]]></title><description><![CDATA[<p>zeig doch mal ein bisschen code,<br />
oder schick es mir zu ...</p>
<p>eigentlich müsste das funktionieren.</p>
<p>jenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110448</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Fri, 04 Aug 2006 10:07:50 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Fri, 04 Aug 2006 11:02:44 GMT]]></title><description><![CDATA[<p>Hab den Fehler gefunden, hatte in paar virtual deklartionen im Hauptprogramm vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110475</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Fri, 04 Aug 2006 11:02:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Fri, 04 Aug 2006 14:01:36 GMT]]></title><description><![CDATA[<p>Was muss ich eigendlich bei der Programmierung mit virtuellen Methoden alles beachten, weil, die Header von Hauptprogramm und DLL scheinen ja exakt gleich sein zu müssen, damit das Funktioniert. Sprich, wenn ich die API im Hauptprogramm erweiter muss ich auch den Header der DLL anpassen, auch wenn die die neue Funktion gar nicht benutzt, oder seh ich das falsch?</p>
<p>Wird vor allem später dann blöde sein, wenn ich DLLs/Plugins von Drittanbietern haben sollte, dann müssen die ja jedes mal neu Kompiliert werden, wenn sich etwas an der API ändert <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=":-/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110607</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Fri, 04 Aug 2006 14:01:36 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Fri, 04 Aug 2006 15:21:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1222">@FloFri</a><br />
Wenn du die API änderst, müssen alle Plugins neu kompiliert werden. Daher versuchen viele Projekte API Änderungen zu vermeiden und eine API Änderung ist oft ein Grund dafür die Major-Versionsnummer zu ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110640</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Fri, 04 Aug 2006 15:21:17 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Fri, 04 Aug 2006 17:36:57 GMT]]></title><description><![CDATA[<p>Es geht mir ja nicht darum, die Signatur einer Funktion oder die Funktionsweise zu ändern.</p>
<p>Ich meinte eher das folgende:<br />
Wenn wir mal von einem Socket-Objekt aus einer Netzwerk-Klasse ausgehen und sagen wir mal, das hat Funktionen zum connecten, senden und empfangen und wird von dem Plugin benutzt.<br />
Jetzt kommen aber noch Funktionen für einen Server, also zum beispiel listen dazu, dann müsste, wenn ich das richtig sehe, bei der vorgehensweise mit den virtuellen methoden, gleich alle plugins, die so einen socket benutzen neu kompiliert werden, auch wenn sie die listen-methode gar nicht verwenden.<br />
Wenn ich zum Beispiel funktionspointer benutzen würde, währe das nicht der fall, aber funktionspointer sind eben um einiges aufwendiger, als virtuelle methoden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110730</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Fri, 04 Aug 2006 17:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Mon, 07 Aug 2006 07:05:38 GMT]]></title><description><![CDATA[<p>Sieht da noch jemand eine Möglichkeit das Problem auf eine einfache Art und Weise zu lösen oder muss ich mir doch einen komplexen Pluginhandler mit Funktionspointern/Funktoren basteln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1111977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1111977</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Mon, 07 Aug 2006 07:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Mon, 07 Aug 2006 07:36:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>warum nimmst du dann nicht einfach eine weitere &quot;virtuelle plugin klasse&quot; her?</p>
<p>Und dann mit dynamischen Casts herausfinden, um welche Klasse es sich wirklich handelt...</p>
<p>jenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1111990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1111990</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Mon, 07 Aug 2006 07:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Mon, 07 Aug 2006 07:41:04 GMT]]></title><description><![CDATA[<p>Hm, ich verstehe nicht ganz, wie du das meinst, also, jedes mal, wenn ich die API erweiter soll ich von der vorherigen Klasse eine neue ableiten und ergänzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1111993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1111993</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Mon, 07 Aug 2006 07:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Mon, 07 Aug 2006 12:38:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ableiten wäre wahrscheinlich am sinnvollsten.<br />
Wenn ich das jetzt richtig verstanden habe funzt es ja so, dass eine dll geladen und von ihr ein Objekt an das Hauptprogramm übergeben wird, oder?<br />
Oder funktioniert es andersrum? Egal, jeweils der der das Objekt empfängt muss halt im Rahmen seiner Kenntnis herausfinden, um was für einen Typ es sich handelt.<br />
Du übergibst ja bestimmt nur einen Pointer, oder?</p>
<p>Zeig doch mal ein bisschen Code, wo dein Problem auftreten könnte. Das ist so luftleer einfach unklarer zu erklären...</p>
<p>jenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112205</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Mon, 07 Aug 2006 12:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Mon, 07 Aug 2006 12:59:02 GMT]]></title><description><![CDATA[<p>Ok, ich poste mal ein bisschen Beispielcode:</p>
<p><strong>Hier die DLL-Files</strong></p>
<p><em>main.cpp</em></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &lt;windows.h&gt;
#include &quot;client.h&quot;

using namespace std;

#define _DLL_FUNCTION extern &quot;C&quot; __declspec(dllexport)

_DLL_FUNCTION void myFunc(Client *myclitest);

// a sample exported function
void myFunc(Client *myclitest)
{
    cout &lt;&lt; &quot;Calling Client-Function&quot; &lt;&lt; endl;
    myclitest-&gt;ShowString();
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}
</code></pre>
<p><em>client.h</em></p>
<pre><code class="language-cpp">#ifndef CLIENT_H
#define CLIENT_H

#include &lt;string&gt;
#include &lt;iostream&gt;

using namespace std;

class Client
{
    public:
        Client(string initStr);
        virtual ~Client();
        virtual void ShowString();
};

#endif // CLIENT_H
</code></pre>
<p><strong>Hier das Hauptprogramm</strong></p>
<p><em>main.cpp</em></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;

#include &quot;client.h&quot;

using namespace std;

typedef void (WINAPI * p_myFunc) (Client *myclitest);

int main()
{
    Client* myCli = new Client(&quot;ichbins&quot;);
	cout &lt;&lt; &quot;Loading DLL&quot; &lt;&lt; endl;

    HINSTANCE dllInstance = LoadLibrary(&quot;testdll/testdll.dll&quot;);

    if (dllInstance == NULL)
    {
        cout &lt;&lt; &quot;Can not load!&quot; &lt;&lt; endl;
        return 1;
    }

    p_myFunc myFunc = (p_myFunc)GetProcAddress((HMODULE)dllInstance, &quot;myFunc&quot;);

    if (myFunc == NULL)
    {
        cout &lt;&lt; &quot;Error&quot; &lt;&lt; endl;
        return 1;
    }

    cout &lt;&lt; &quot;Calling DLL-Function&quot; &lt;&lt; endl;
    myFunc(myCli);

	return 0;
}
</code></pre>
<p><em>client.h</em></p>
<pre><code class="language-cpp">#ifndef CLIENT_H
#define CLIENT_H

#include &lt;string&gt;
#include &lt;iostream&gt;

using namespace std;

class Client
{
    public:
        Client(string initStr);
        virtual ~Client();
        virtual void ShowString();
        void check();
    private:
        string myStr;
};

#endif // CLIENT_H
</code></pre>
<p><em>client.cpp</em></p>
<pre><code class="language-cpp">#include &quot;client.h&quot;

Client::Client(string initStr)
{
    myStr = initStr;
}

Client::~Client()
{
}

void Client::ShowString()
{
    cout &lt;&lt; myStr &lt;&lt; endl;
}
</code></pre>
<p>So. Soweit funktioniert das Beispielprogramm auch. Jetzt zu meinem Problem.<br />
Gehen wir mal davon aus, die DLL kommt von einem Drittanbieter und es gibt auch noch eine Reihe Anderer.</p>
<p>Jetzt füge ich eine neue Funktion</p>
<pre><code class="language-cpp">virtual void SetString(string newString);
</code></pre>
<p>zu der Client-Klasse im Hauptprogramm hinzu, damit die Dlls bei Bedarf noch etwas mehr machen können.<br />
Jetzt muss ich aber alle Dlls neu kompilieren, bzw. kompilieren lassen, da die VMT der Klasse Client in dem Hauptprogramm und in den Dlls nicht mehr übereinstimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112224</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Mon, 07 Aug 2006 12:59:02 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Tue, 08 Aug 2006 12:36:13 GMT]]></title><description><![CDATA[<p>mit vmt meinst du die virtual method table? nur um sicherzugehen.</p>
<p>ja, stimmt. die könnte sich verändern. wahrscheinlich auch dann, wenn man ableitet.<br />
aber eigentlich sollte die sich nicht mit jeder neuen methode vergrößern, die reservieren meist mehr platz als nötig. aber das ist dann natürlich compilerabhängig. also eher unsicher und damit unbrauchbar.</p>
<p>wie wäre es, wenn du für neue funktionalitäten neue klassen einführst und dazu auch passende myfuncs, dann kannst du daran entscheiden, welche klasse die dll haben will und übergibst eben die entsprechende.<br />
dann ändert sich die gemeinsame header datei nicht mehr..</p>
<p>warum hast du eigentlich zwei client.h dateien gepostet?</p>
<p>ciao,<br />
jenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112933</guid><dc:creator><![CDATA[jenz]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Tue, 08 Aug 2006 13:00:37 GMT]]></title><description><![CDATA[<p>Gibt da zwei Möglichkeiten die mir einfallen:<br />
a) Du fügst neue Funktionalität hinzu indem du ein neues Interface erstellst, dass das alte erbt, dann können neue Plug-Ins das neue nehmen und alte Plug-Ins laufen weiterhin, ungefähr so:</p>
<pre><code class="language-cpp">class SocketInterfaceVersion1
{
  public:
  //Methoden
};

class SocketInterfaceVersion2 : public SocketInterfaceVersion1
{
  public:
  //Neue Methoden
};
</code></pre>
<p>b) Du benutzt die Interfaces nicht mehr direkt sondern über Proxies welche automatisch für jedes Plug-In die passende Version raussuchen.<br />
Einen Artikel dazu gibts <a href="http://www.usenix.org/publications/library/proceedings/usenix98/full_papers/hjalmtysson/hjalmtysson.pdf" rel="nofollow">hier</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112970</guid><dc:creator><![CDATA[Dr. Prof]]></dc:creator><pubDate>Tue, 08 Aug 2006 13:00:37 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Wed, 09 Aug 2006 06:46:20 GMT]]></title><description><![CDATA[<p>Ja, die Virtual Method Table meinte ich. Die wird ja inkonsistent, wenn ich im Hauptprogramm eine neue virtuelle Methode hinzufüge, in der DLL aber nicht.</p>
<p>Ich hab zwei client.h gepostet, weil die eine die ist, die in der DLL verwendet wird und die andere die, die im Hauptprogramm verwendet wird.</p>
<p>Mit den Proxys, das schau ich mir mal an, das könnte eventuel was sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113445</guid><dc:creator><![CDATA[FloFri]]></dc:creator><pubDate>Wed, 09 Aug 2006 06:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Wed, 09 Aug 2006 08:22:13 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1222">@FloFri</a></p>
<p>Du exportierst Klassen (auch wenns nur C++ Schnittstellen, also abstrakte klassen sind). d.h. dein Programm und dein Plugin sollten mit dem selben compiler uebersetzt sein, und paar compilerflags muessen auch uebereinstimmen.</p>
<p>Prinzipiell sollten dann auch nur rein abstrakte klassen und Zeiger auf diese klassen sowie POD's teil deiner schnittstelle sein. Insbesondere halb auskompilierte klassen und per tamplate generierte klassen sollten nie teil deiner schnittstelle sein. Wenn da bestimmte compilerflags ned 100% identisch sind kanns schon schiefgehen. Zum beispiel sollten std::string und std:: - container kein Bestandteil deiner schnittstelle sein, das macht die compilereinstellungen gefaehrlich ....</p>
<p>Die Interfaces sollten auch nur in einer ! Headerdatei defininiert werden, welche dann von App und plugin gemeinsam genutzt werden. Sobald dann irgendwie nen unresolved symbol kommt, weil irgendwo ne definition fehlt, dann weisst das an deinen Schnittstellen noch was faul ist ....</p>
<p>willst du wirkliche unabhaengigkeit bei solchen schnittstellen, wirst um plain c nicht drumherumkommen ... da iss dann alles compilerunabhaengig ...</p>
<p>Die Reihenfolge in der VMT ist eigentlich definiert ! Und zwar sobald du immer nur funktionen &quot;hintenanhaengst&quot; wird eine aelter version der klassendefinition mit der neuen vmt noch funktionieren. Nur solltest das mit allen mitteln vermeiden. Ableiten dder schnittstellen um zu erweitern ist besser und sicherer.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113484</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 09 Aug 2006 08:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Shared Libs auf Funktionen im Hauptprogramm zugreifen? on Wed, 09 Aug 2006 08:47:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#ifndef CLIENT_H
#define CLIENT_H

#include &lt;string&gt; 
#include &lt;iostream&gt; // stl header kopf einer schnittstelle sind immer nen ganz schlechtes zeichen ! STL dinger sind meist templates -&gt; compilierung bei bedarf 

using namespace std; // das im header iss ne mittlere katastrophe, in nem Interface header potentiert sich das nochmals. Benutzer deiner klassenschnittstelle bekommen hier definitiv namespace konflikte

class Client
{
    public:
        Client(string initStr);  // std::string - auskompiliertes Template als unbergabeparameter ... wenn hier die compilerflags ned stimmen ... 
        virtual ~Client();
        virtual void ShowString();
};

#endif // CLIENT_H
</code></pre>
<p>Besser:</p>
<p>Client_if.h</p>
<pre><code class="language-cpp">class IClient
{
protected:   // annahme, nur deine Anwendung soll IClients erstellen koennen 
    // leerer CTor und DTor 
    IClient(){}
    virtual ~IClient(){}
public:
    virtual void ShowString() = 0;
};
</code></pre>
<p>Das waer deine schnittstelle, ... nun brauchst noch ne Impl dazu<br />
ClientImpl.h</p>
<pre><code class="language-cpp">class ClientImpl : public IClient
{
public:
    ClientImpl(std::string strinit);
    virtual ClientImpl();

    // und wir muessen die abstrakte funktion auch definieren .... 
    virtual void ShowString(); // diesmal definiert ! 
};
</code></pre>
<p>die CLientImpl.cpp solltest nu selber hinbekommen</p>
<p>deine main funktion !</p>
<pre><code class="language-cpp">int main()
{
    // Client* myCli = new Client(&quot;ichbins&quot;); // warum dynamisch ? 
    ClientImpl cli(&quot;ich bins!&quot;);
    cout &lt;&lt; &quot;Loading DLL&quot; &lt;&lt; endl;

    HINSTANCE dllInstance = LoadLibrary(&quot;testdll/testdll.dll&quot;);

    if (dllInstance == NULL)
    {
        cout &lt;&lt; &quot;Can not load!&quot; &lt;&lt; endl;
        return 1;
    }

    p_myFunc myFunc = (p_myFunc)GetProcAddress((HMODULE)dllInstance, &quot;myFunc&quot;);

    if (myFunc == NULL)
    {
        cout &lt;&lt; &quot;Error&quot; &lt;&lt; endl;
        return 1;
    }

    cout &lt;&lt; &quot;Calling DLL-Function&quot; &lt;&lt; endl;
    myFunc(&amp;cli); // hier nu einfach zeiger auf das statiosche objet uebergeben ...
    // wo war in der alten version  das delete ? 
    return 0;
}
</code></pre>
<p>Und in der Dll arbeitest nur noch mit dem Interface !</p>
<p>auszug aaus deiner dll impl</p>
<pre><code class="language-cpp">/ a sample exported function
void myFunc(IClient *myclitest)
{
    cout &lt;&lt; &quot;Calling Client-Function&quot; &lt;&lt; endl;
    myclitest-&gt;ShowString();
}
</code></pre>
<p>Prinzip verstanden ?</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1113513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1113513</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 09 Aug 2006 08:47:59 GMT</pubDate></item></channel></rss>