<?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[Komplette Klassen in .lib einbinden?]]></title><description><![CDATA[<p>Hallo.<br />
Wie man Interfaces erstellt um ein Pluginsystem bereitzustellen habe ich mittlerweile gut verstanden; einziges Problem bleiben Klassen die man auch aus dem Plugin aus erstellen können soll.</p>
<p>Mein einziger Ansatz wäre jetzt, die gesamte Klasse, also Header inklusive C++-Code, mitzuliefern, was ich jedoch nach Möglichkeit vermeiden möchte (aus diversen Gründen). Gibt es also die Möglichkeit, nur die Headerdateien zu liefern und die Implementation des C++-Codes in die .lib Datei zu verlagern?</p>
<p>Oder sollte ich das lieber anders regeln, in dem ich in meinem Programm z.B. eine Funktion erstelle, die <code>CreateClassXY</code> heißt, und dann einen Pointer zurückliefert, der dem Header entspricht, den ich ausliefere?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274035/komplette-klassen-in-lib-einbinden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 20:34:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274035.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Sep 2010 22:14:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Komplette Klassen in .lib einbinden? on Fri, 17 Sep 2010 22:14:33 GMT]]></title><description><![CDATA[<p>Hallo.<br />
Wie man Interfaces erstellt um ein Pluginsystem bereitzustellen habe ich mittlerweile gut verstanden; einziges Problem bleiben Klassen die man auch aus dem Plugin aus erstellen können soll.</p>
<p>Mein einziger Ansatz wäre jetzt, die gesamte Klasse, also Header inklusive C++-Code, mitzuliefern, was ich jedoch nach Möglichkeit vermeiden möchte (aus diversen Gründen). Gibt es also die Möglichkeit, nur die Headerdateien zu liefern und die Implementation des C++-Codes in die .lib Datei zu verlagern?</p>
<p>Oder sollte ich das lieber anders regeln, in dem ich in meinem Programm z.B. eine Funktion erstelle, die <code>CreateClassXY</code> heißt, und dann einen Pointer zurückliefert, der dem Header entspricht, den ich ausliefere?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954015</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 17 Sep 2010 22:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Komplette Klassen in .lib einbinden? on Fri, 17 Sep 2010 22:48:37 GMT]]></title><description><![CDATA[<p>Du meinst denke ich .dll und nicht .lib.<br />
Das letzte is das was Du suchst. Du kannst eine DLL nur dynamisch laden ( was ja genau ein Plugin sein soll ) wenn Du einen eindeutigen Namen der Funktion hast die geladen werden soll. Und das geht nur mit extern C in C++, da dadurch Name Mangling verhindert wird.</p>
<pre><code class="language-cpp">MyPlugin* plugin = NULL;

void DllEntry()
{
  case DLL_PROCESS_ATTACH:
  case DLL_THREAD_ATTACH:
      plugin = new MyPlugin();

  case DLL_THREAD_DETACH: 
  case DLL_PROCESS_DETACH: 
      delete plugin;
}

extern &quot;C&quot;
MyPlugin* CreatePlugin()
{
   return plugin;
}
</code></pre>
<p>So in die Richtung sollte das aussehen. Natürtlich muss der &quot;Host Anwendung&quot; das Aussehen der Klasse MyPlugin bekannt sein, damit Du es verwenden kannst. Hier empfiehlt sich eine Klasse die pure virtual funktionen enthält die das Plugin implementieren muss.<br />
HTH<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954021</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 17 Sep 2010 22:48:37 GMT</pubDate></item><item><title><![CDATA[Reply to Komplette Klassen in .lib einbinden? on Fri, 17 Sep 2010 22:50:00 GMT]]></title><description><![CDATA[<p>Hi.<br />
Ja, genau so etwas meine ich.</p>
<p>Das heißt, Klassen die direkt im Plugin instanzierbar und kopierbar sein sollen, MUSS ich komplett ausliefern, richtig?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954022</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 17 Sep 2010 22:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to Komplette Klassen in .lib einbinden? on Fri, 17 Sep 2010 22:55:10 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Hi.<br />
Ja, genau so etwas meine ich.</p>
<p>Das heißt, Klassen die direkt im Plugin instanzierbar und kopierbar sein sollen, MUSS ich komplett ausliefern, richtig?</p>
<p>Gruß</p>
</blockquote>
<p>Ja. Irgendwo musst Du ja die Funktionen spezifizieren die eingesetzt werden können von der PluginKlasse. Am besten man erstellt ein enum mit Plugin-Typen, damit das Programm weiss, um was für eine art von plugin es sich handelt und was es überschreibt. Aber das kommt immer auf das Programm an wie man es organisiert und aufbaut.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954023</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 17 Sep 2010 22:55:10 GMT</pubDate></item><item><title><![CDATA[Reply to Komplette Klassen in .lib einbinden? on Sat, 18 Sep 2010 07:38:43 GMT]]></title><description><![CDATA[<p><a href="http://www.fileuploadx.de/190145" rel="nofollow">http://www.fileuploadx.de/190145</a></p>
<p>Hab Dir hier mal ein Sample fix zusammengebastelt.<br />
Ist halt Windows.</p>
<p>Host.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &quot;../PluginInterface.hpp&quot;

#ifdef _DEBUG 
	const std::wstring g_plugin_name = L&quot;./Plugin1-d&quot;;
#else
	const std::wstring g_plugin_name = L&quot;Plugin1&quot;;
#endif

HINSTANCE g_dll_handle;
typedef MyPluginInterface* (_cdecl	CreatePluginProc)();
typedef void (_cdecl DestroyPluginProc)();

MyPluginInterface* LoadPlugin(LPCWSTR filename)
{
	g_dll_handle = LoadLibrary(filename);
	if ( g_dll_handle != NULL )
	{
		CreatePluginProc* CreatePlugin = (CreatePluginProc*)GetProcAddress(g_dll_handle, &quot;CreatePlugin&quot;);
		MyPluginInterface* plugin = CreatePlugin();
		return plugin;
	}
	return NULL;
}

void FreePlugin()
{
	if ( g_dll_handle != NULL )
	{
		DestroyPluginProc* DestroyPlugin = (DestroyPluginProc*)GetProcAddress(g_dll_handle, &quot;DestroyPlugin&quot;);
		DestroyPlugin();
		FreeLibrary(g_dll_handle);
	}		
}

int main()
{
	MyPluginInterface* plugin = NULL;
	plugin = LoadPlugin(g_plugin_name.c_str());

	if ( plugin )
	{
		plugin-&gt;print_message(&quot;Hello World&quot;);
		FreePlugin();
		return S_OK;
	}	
	else
	{
		std::cout &lt;&lt; &quot;Cannot load plugin!&quot; &lt;&lt; std::endl;
		return E_FAIL;
	}	
}
</code></pre>
<p>Plugin.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;../PluginInterface.hpp&quot;
#include &lt;Windows.h&gt;

class MyPlugin : public MyPluginInterface
{
	virtual void print_message(const std::string&amp; msg)
	{
		std::cout &lt;&lt; &quot;[Plugin] &quot; &lt;&lt; msg &lt;&lt; std::endl;
	}
};

MyPlugin* g_plugin = NULL;

int __stdcall DllMain(void * HDllHandle, unsigned reason, void * reserved)
{
	switch(reason)
	{
	case DLL_THREAD_ATTACH:
	case DLL_PROCESS_ATTACH:
		{
			break;
		}

	case DLL_PROCESS_DETACH:
	case DLL_THREAD_DETACH:
		{
			break;
		}
	}
	return TRUE;
}

extern &quot;C&quot;
__declspec(dllexport) MyPluginInterface* CreatePlugin()
{
	g_plugin = new MyPlugin;
	return g_plugin;
}

extern &quot;C&quot; 
__declspec(dllexport) void DestroyPlugin()
{
	delete g_plugin;
}
</code></pre>
<p>MyPluginInterface.h:</p>
<pre><code class="language-cpp">#ifndef PLUGININTERFACE_HPP
#define PLUGININTERFACE_HPP

#include &lt;string&gt;

class MyPluginInterface
{
public:
	virtual void print_message(const std::string&amp; msg) = 0;
};

#endif // PLUGININTERFACE_HPP
</code></pre>
<p>Einfaches Sample, aber funktioniert ;).<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954026</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 18 Sep 2010 07:38:43 GMT</pubDate></item><item><title><![CDATA[Reply to Komplette Klassen in .lib einbinden? on Fri, 17 Sep 2010 23:47:11 GMT]]></title><description><![CDATA[<p>Cool, danke für das Beispiel, hilft mir schon weiter <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>Gute Nacht :&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954029</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 17 Sep 2010 23:47:11 GMT</pubDate></item></channel></rss>