<?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[Form in Klasse in DLL....unresolved external!]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schonwieder! <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>Habe nun meine übung etwas verstärkt, und wollte über eine klasse eine form aus einer dll verwalten:</p>
<p>DLL.h</p>
<pre><code class="language-cpp">#ifndef __FILE1_H
#define __FILE1_H

#include &quot;Unit2.h&quot;
class MyForm
{
 public:
  MyForm();
  ~MyForm();
  void ShowIt();
 private:
  TForm2* Form2;
};
#endif
</code></pre>
<p>dll.cpp</p>
<pre><code class="language-cpp">#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	return 1;
}
//---------------------------------------------------------------------------
MyForm::MyForm()
{
    Form2 = new TForm2(0);
}

MyForm::~MyForm()
{
    if(Form2)
     delete Form2;
}

void MyForm::ShowIt()
{
    Form2-&gt;Show();
}

extern &quot;C&quot; __declspec(dllexport)MyForm* GetMyForm()
{
    return new MyForm;
}

extern &quot;C&quot; __declspec(dllexport)void FreeMyForm(MyForm* my)
{
    delete my;
}
</code></pre>
<p>Aufrufendes Programm</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Main.h&quot;
#include &quot;File1.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE h = LoadLibrary(&quot;Project1.dll&quot;);
if(h)
   {
    typedef MyForm*(*pFunc)();
    pFunc myformFunc;
    MyForm* mForm;

    myformFunc = (pFunc)GetProcAddress(h,&quot;_GetMyForm&quot;);
    if(myformFunc)
       {
         mForm = myformFunc();
         mForm-&gt;ShowIt();
       }
    else
      ShowMessage(&quot;Klasse konnte nicht geladen werden&quot;);
   }
else
   {
       ShowMessage(&quot;Project1.dll konnte nicht geladen werden&quot;);
   }
}
//---------------------------------------------------------------------------
</code></pre>
<p>bekomme immer fehler.: unaufgelöste externe MyForm::ShowIt()! Wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172098/form-in-klasse-in-dll-unresolved-external</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 08:43:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172098.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Feb 2007 12:50:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 12:50:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schonwieder! <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>Habe nun meine übung etwas verstärkt, und wollte über eine klasse eine form aus einer dll verwalten:</p>
<p>DLL.h</p>
<pre><code class="language-cpp">#ifndef __FILE1_H
#define __FILE1_H

#include &quot;Unit2.h&quot;
class MyForm
{
 public:
  MyForm();
  ~MyForm();
  void ShowIt();
 private:
  TForm2* Form2;
};
#endif
</code></pre>
<p>dll.cpp</p>
<pre><code class="language-cpp">#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	return 1;
}
//---------------------------------------------------------------------------
MyForm::MyForm()
{
    Form2 = new TForm2(0);
}

MyForm::~MyForm()
{
    if(Form2)
     delete Form2;
}

void MyForm::ShowIt()
{
    Form2-&gt;Show();
}

extern &quot;C&quot; __declspec(dllexport)MyForm* GetMyForm()
{
    return new MyForm;
}

extern &quot;C&quot; __declspec(dllexport)void FreeMyForm(MyForm* my)
{
    delete my;
}
</code></pre>
<p>Aufrufendes Programm</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Main.h&quot;
#include &quot;File1.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE h = LoadLibrary(&quot;Project1.dll&quot;);
if(h)
   {
    typedef MyForm*(*pFunc)();
    pFunc myformFunc;
    MyForm* mForm;

    myformFunc = (pFunc)GetProcAddress(h,&quot;_GetMyForm&quot;);
    if(myformFunc)
       {
         mForm = myformFunc();
         mForm-&gt;ShowIt();
       }
    else
      ShowMessage(&quot;Klasse konnte nicht geladen werden&quot;);
   }
else
   {
       ShowMessage(&quot;Project1.dll konnte nicht geladen werden&quot;);
   }
}
//---------------------------------------------------------------------------
</code></pre>
<p>bekomme immer fehler.: unaufgelöste externe MyForm::ShowIt()! Wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221080</guid><dc:creator><![CDATA[bvbcvb]]></dc:creator><pubDate>Thu, 01 Feb 2007 12:50:28 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 13:05:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Woher soll deine Anwendung MyForm::ShowIt auch kennen, du importierst diese Klasse ja nicht aus der dll in dein Projekt.<br />
Man kann eine Wrapperklasse für die dll-Funktionen schreiben aber<br />
1. Diese Wrapperklasse muß dem Hauptprogramm vollständig bekannt sein (Deklaration und Definition)<br />
2. Die in der Klasse verwendeten Funktionen bzw. Klassen aus der dll müssen auch alle aus der dll heraus importiert werden.</p>
<p>Ich mach sowas normalerweise so.<br />
Die Wrapperklasse lädt die dll im Konstruktor (oder bei der ersten verwendung einer memberfunktion).<br />
Sie hält Pointer auf alle von der dll importierten Funktionen (werden ebenfalls vor der ersten Verwendung initialisiert).<br />
Die Memberfunktionen dieser Klasse rufen dann die aus der dll importierten Funktionen auf.<br />
Die dll wird im Destruktor wieder entladen.</p>
<p>Bei dir würde es erstmal reicher aus ShowIt eine exportierbare dll-Funktion zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221095</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Feb 2007 13:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 13:06:52 GMT]]></title><description><![CDATA[<p>und eine frage habe ich gleich noch:<br />
im Destr der Klasse wird ja der speicher der form2 freigegeben!<br />
Ist das eine gute möglichkeit? Was würde passieren, wenn ich im OnClose der Form2 caFree setze?Dann kann ich ja die Form mit der Klasseninstanz nicht mehr verwenden (nochmal öffnen oder ähnliches), da ja nur im Konstruktor meiner Klasse der speicher geholt wird oder?<br />
Wie ist hier die richtige vorgehensweise?Sicherlich mit dem Destruktor der Klasse welche die Form2 anzeigt oder?</p>
<p>Und sollte der Zeiger auf die Klasse im aufrufenden Programm, besser ein Member der Form1 Klasse sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221099</guid><dc:creator><![CDATA[bvbcvb]]></dc:creator><pubDate>Thu, 01 Feb 2007 13:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 13:09:44 GMT]]></title><description><![CDATA[<p>hm...ganz klar ist mir deine erklärung nicht ganz <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>kannst du das vielleicht an meinem code etwas konkretisieren?<br />
Mit wrapperklasse meinst du hier diese MyForm oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221103</guid><dc:creator><![CDATA[bvbcvb]]></dc:creator><pubDate>Thu, 01 Feb 2007 13:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 13:47:19 GMT]]></title><description><![CDATA[<p>Ja, meine ich.<br />
Konkret:<br />
Du hast MyForm::ShowIt in der dll.h deklariert. Dieser headerdatei inkludierst du sicher irgendwo in deinem Hauptprogramm.<br />
Da aber die Definition von MyForm::ShowIt in deiner dll steckt und du MyForm nicht exportierst kann der Linker beim Hauptprogramm so nichts finden.<br />
Lass diese Klasse MyForm erstmal weg und erzeuge dir zusätzlich noch eine eigene Showfunktion die du exportierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221124</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Feb 2007 13:47:19 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 13:54:00 GMT]]></title><description><![CDATA[<p>Hier nun mal ein Vorschlag für eine Wrapperklasse wie ich sie oben meinte.<br />
<strong>dll.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;Unit2.h&quot;

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------

extern &quot;C&quot; __declspec(dllexport)TForm2* GetForm2()
{
    return new TForm2(0);
}

extern &quot;C&quot; __declspec(dllexport)void FreeForm2(TForm2* form)
{
    delete form;
} 	

extern &quot;C&quot; __declspec(dllexport)void ShowForm2(TForm2* form)
{
    form-&gt;ShowModal();
}
</code></pre>
<p><strong>dll.h</strong></p>
<pre><code class="language-cpp">class TForm2;

typedef TForm2 *(*getForm)();
typedef void (*useForm)();

class MyForm
{
	private:
	TForm2* form;
	getForm getForm2;
	useForm freeForm2, showForm2;
	HINSTANCE hdll;
	bool valid;

	public:
	MyForm() : valid(false), form(0)
	{
		hdll = LoadLibrary(&quot;Project1.dll&quot;);
		if( hdll )
		{
			getForm2 = (getForm)GetProcAddress(h,&quot;_GetForm2&quot;);
			freeForm2 = (useForm)GetProcAddress(h,&quot;_FreeForm2&quot;);
			showForm2 = (useForm)GetProcAddress(h,&quot;_ShowForm2&quot;);
			if( getForm2 &amp;&amp; freeForm2 &amp;&amp; showForm2 )
            {
                valid = true;
			   form = getForm2();
            }
		}
	}
	~MyForm()
	{
		if( valid ) freeForm2(form);
		if( hdll ) FreeLibrary(hdll);
	}
	ShowIt()
	{
	  if( valid ) showForm2();
	}
	bool isValid() { return valid; }
}
</code></pre>
<p>Hauptprogramm</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Main.h&quot;
#include &quot;File1.h&quot;
#include &quot;dll.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	 MyForm myform;
	 if( myform.isValid )
	 {
	    MyForm.ShowIt();
	 }
	 else
   {
       ShowMessage(&quot;Project1.dll konnte nicht geladen werden&quot;);
   }
}
//---------------------------------------------------------------------------
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1221126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221126</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Feb 2007 13:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 15:14:23 GMT]]></title><description><![CDATA[<p>dieses laden der Project1.dll verwirrt mich grad!<br />
Project1.dll ist doch die dll selbst (dll.h und .cpp) oder?<br />
Sie würde sich praktisch selbst laden, oder ist dies hier nur eine header und code datei (diese dll.h und .cpp) welche die dll lädt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221202</guid><dc:creator><![CDATA[bvbcvb]]></dc:creator><pubDate>Thu, 01 Feb 2007 15:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 15:17:53 GMT]]></title><description><![CDATA[<p>Das liegt hier nur an den Namen. Benenn die dll.h in meinem Code einfach mal um. Die kommt nicht in dein dll-Projekt, sondern nur in das aufrufende Programm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221207</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Feb 2007 15:17:53 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 18:03:24 GMT]]></title><description><![CDATA[<p>also ist es nur eine &quot;schnittstellendatei&quot;?<br />
habe noch eine frage:<br />
ich möchte eine art plugin realisieren<br />
d.h ich möchte zusätzliche funktionen über dlls hinzufügen!<br />
meine frage ist nun, wie muss ich eine funktion in der dll deklarieren, damit sie einem OnClick - Konvention eines MenüItems enstpricht?</p>
<p>Hintergund: ich möchte einem MenüItem als OnClick eine Funktion aus der DLL zuordnen, dynamisch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221322</guid><dc:creator><![CDATA[bvbvcb]]></dc:creator><pubDate>Thu, 01 Feb 2007 18:03:24 GMT</pubDate></item><item><title><![CDATA[Reply to Form in Klasse in DLL....unresolved external! on Thu, 01 Feb 2007 18:11:13 GMT]]></title><description><![CDATA[<p>Ja, das ist eine Art Schnittstellenklasse, die die Funktionen der dll kapselt. Das mach meiner Meinung nach die Bedienung einfacher.<br />
Zu PlugIns gab es hier mal so eine Art Tutorial. Ich finde das derzeit nicht, du kannst aber mal suchen.<br />
Direkt eine Funktion aus einer dll zu OnClick zuordnen wird wohl nichts. Die Funktionen die du dort verwendest sind Memberfunktionen der entsprechenden Form. Sowas kannst du nicht aus einer dll importieren. Du kannst aber z.Bsp. eine zentrale OnClick-Funktion für alle Menüitems erzeugen und dort in einem switch je nach Sender (Menüitem) entscheiden welche freie Funktion du aufrufst. Ich denke das ist so am Einfachsten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1221325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1221325</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Feb 2007 18:11:13 GMT</pubDate></item></channel></rss>