<?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[Probleme bei dynamischem Laden von DLLs]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>gerade eben habe ich mich an das Laden von DLLs gewagt und bin gescheitert. Ich bitte um Hilfe.</p>
<p>Das Problem: Ich habe mir eine Klasse geschrieben, die dynamisch DLLs laden können sollte. So sieht sie aus:</p>
<pre><code>bool DLLLader::dllLaden(char* dllname)
{
   if (!DllInstance) DllInstance = LoadLibrary(dllname); // DLL laden
   if (DllInstance != NULL)
   {
      status = &quot;DLL wurde geladen.&quot;;
      return true;
   }
   else
   {
      status = &quot;DLL wurde nicht geladen.&quot;;
      return false;
   }
}

bool DLLLader::dllEntladen(char* dllname)
{
   if (DllInstance)
   {
      if (FreeLibrary(DllInstance))
      {
         DllInstance = NULL; // DLL entladen
      }
   }
   if (!DllInstance)
   {
      status = &quot;DLL wurde entladen.&quot;;
      return true;
   }
   else
   {
      status = &quot;DLL wurde nicht entladen.&quot;;
      return false;
   }
}

TObject* DLLLader::dllFunktionLaden(char* funktionsname)
{
   // Funktionstyp deklarieren
   typedef TObject* (__stdcall *IMPFUNC) (String);

   IMPFUNC DllFunktion;

   // Deklaration für die DLL-Funktion
   if (DllInstance)
   {
      DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, funktionsname);
      if (DllFunktion)
      {
         return DllFunktion(funktionsname);
      }
      else status = &quot;Funktionsname existiert nicht!&quot;;
   }
   else
   {
      status = &quot;Bitte DLL laden!&quot;;
   }
  return NULL;
}
</code></pre>
<p>Problem eins:<br />
Mit dem Aufruf</p>
<pre><code>dlllader = new DLLLader();
bool erfolg = dlllader-&gt;dllLaden(&quot;Datenbankverbindung.dll&quot;);
</code></pre>
<p>bekomme ich immer true zurück. Egal wie der Dateiname lautet, es ist immer ein Erfolg. Wenns denn wahr wäre, wäre ich froh...</p>
<p>Problem zwei (was vielleicht damit zusammenhängt):<br />
lade ich eine Funktion, z.B.</p>
<pre><code>(TADOConnection*)dlllader-&gt;dllFunktionLaden(&quot;verbindungHerstellen&quot;);
</code></pre>
<p>kann ich in der Einzelschrittverfolgung sehen, dass der Funktionsname ungültig ist, er gibt also immer false zurück.</p>
<p>Da ich, wie gesagt, gerade erst angefangen habe, mich um dynamisch geladene DLLS zu kümmern, stehe ich etwas auf dem Schlauch und bin ratlos. Bitte ädert das.</p>
<p>Danke,</p>
<p>Oliver.</p>
<p>P.S.: Vielleicht zur Ergänzung: Die Datei Datenbankverwaltung.dll befindet sich im gleichen Verzeichnis wie die Projekt.bpr - Datei und sieht so aus:</p>
<pre><code>static TADOConnection* verbindung;

extern &quot;C&quot; __declspec(dllexport) TADOConnection* verbindungHerstellen(String dbname);
extern &quot;C&quot; __declspec(dllexport) void verbindungSchliessen();

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}

TADOConnection* verbindungHerstellen(String dbname)
{
   if (verbindung == NULL)
   {
      try
      {
         TComponent *Owner = FindGlobalComponent(&quot;Datenbankverwaltung&quot;);
         verbindung = new TADOConnection(Owner);
         verbindung-&gt;ConnectionString =
         &quot;Provider=Microsoft.Jet.OLEDB.4.0;&quot;
         &quot;User ID=Admin;&quot;
         &quot;Data Source=Datenbank\\&quot;+dbname+&quot;.mdb;&quot;
         &quot;Mode=Share Deny None;&quot;
         &quot;Extended Properties=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:System database=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Registry Path=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Database Password=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Engine Type=5;&quot;
         &quot;Jet OLEDB:Database Locking Mode=1;&quot;
         &quot;Jet OLEDB:Global Partial Bulk Ops=2;&quot;
         &quot;Jet OLEDB:Global Bulk Transactions=1;&quot;
         &quot;Jet OLEDB:New Database Password=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Create System Database=False;&quot;
         &quot;Jet OLEDB:Encrypt Database=False;&quot;
         &quot;Jet OLEDB:Don't Copy Locale on Compact=False;&quot;
         &quot;Jet OLEDB:Compact Without Replica Repair=False;&quot;
         &quot;Jet OLEDB:SFP=False&quot;;
         verbindung-&gt;Open();
         return verbindung;
      }
      catch(Exception *ex)
      {
         return NULL;
      }
   }
   else return verbindung;
}

void verbindungSchliessen()
{
   verbindung-&gt;Close();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/149138/probleme-bei-dynamischem-laden-von-dlls</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 19:13:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149138.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jun 2006 18:35:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Fri, 02 Jun 2006 18:35:22 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>gerade eben habe ich mich an das Laden von DLLs gewagt und bin gescheitert. Ich bitte um Hilfe.</p>
<p>Das Problem: Ich habe mir eine Klasse geschrieben, die dynamisch DLLs laden können sollte. So sieht sie aus:</p>
<pre><code>bool DLLLader::dllLaden(char* dllname)
{
   if (!DllInstance) DllInstance = LoadLibrary(dllname); // DLL laden
   if (DllInstance != NULL)
   {
      status = &quot;DLL wurde geladen.&quot;;
      return true;
   }
   else
   {
      status = &quot;DLL wurde nicht geladen.&quot;;
      return false;
   }
}

bool DLLLader::dllEntladen(char* dllname)
{
   if (DllInstance)
   {
      if (FreeLibrary(DllInstance))
      {
         DllInstance = NULL; // DLL entladen
      }
   }
   if (!DllInstance)
   {
      status = &quot;DLL wurde entladen.&quot;;
      return true;
   }
   else
   {
      status = &quot;DLL wurde nicht entladen.&quot;;
      return false;
   }
}

TObject* DLLLader::dllFunktionLaden(char* funktionsname)
{
   // Funktionstyp deklarieren
   typedef TObject* (__stdcall *IMPFUNC) (String);

   IMPFUNC DllFunktion;

   // Deklaration für die DLL-Funktion
   if (DllInstance)
   {
      DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, funktionsname);
      if (DllFunktion)
      {
         return DllFunktion(funktionsname);
      }
      else status = &quot;Funktionsname existiert nicht!&quot;;
   }
   else
   {
      status = &quot;Bitte DLL laden!&quot;;
   }
  return NULL;
}
</code></pre>
<p>Problem eins:<br />
Mit dem Aufruf</p>
<pre><code>dlllader = new DLLLader();
bool erfolg = dlllader-&gt;dllLaden(&quot;Datenbankverbindung.dll&quot;);
</code></pre>
<p>bekomme ich immer true zurück. Egal wie der Dateiname lautet, es ist immer ein Erfolg. Wenns denn wahr wäre, wäre ich froh...</p>
<p>Problem zwei (was vielleicht damit zusammenhängt):<br />
lade ich eine Funktion, z.B.</p>
<pre><code>(TADOConnection*)dlllader-&gt;dllFunktionLaden(&quot;verbindungHerstellen&quot;);
</code></pre>
<p>kann ich in der Einzelschrittverfolgung sehen, dass der Funktionsname ungültig ist, er gibt also immer false zurück.</p>
<p>Da ich, wie gesagt, gerade erst angefangen habe, mich um dynamisch geladene DLLS zu kümmern, stehe ich etwas auf dem Schlauch und bin ratlos. Bitte ädert das.</p>
<p>Danke,</p>
<p>Oliver.</p>
<p>P.S.: Vielleicht zur Ergänzung: Die Datei Datenbankverwaltung.dll befindet sich im gleichen Verzeichnis wie die Projekt.bpr - Datei und sieht so aus:</p>
<pre><code>static TADOConnection* verbindung;

extern &quot;C&quot; __declspec(dllexport) TADOConnection* verbindungHerstellen(String dbname);
extern &quot;C&quot; __declspec(dllexport) void verbindungSchliessen();

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}

TADOConnection* verbindungHerstellen(String dbname)
{
   if (verbindung == NULL)
   {
      try
      {
         TComponent *Owner = FindGlobalComponent(&quot;Datenbankverwaltung&quot;);
         verbindung = new TADOConnection(Owner);
         verbindung-&gt;ConnectionString =
         &quot;Provider=Microsoft.Jet.OLEDB.4.0;&quot;
         &quot;User ID=Admin;&quot;
         &quot;Data Source=Datenbank\\&quot;+dbname+&quot;.mdb;&quot;
         &quot;Mode=Share Deny None;&quot;
         &quot;Extended Properties=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:System database=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Registry Path=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Database Password=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Engine Type=5;&quot;
         &quot;Jet OLEDB:Database Locking Mode=1;&quot;
         &quot;Jet OLEDB:Global Partial Bulk Ops=2;&quot;
         &quot;Jet OLEDB:Global Bulk Transactions=1;&quot;
         &quot;Jet OLEDB:New Database Password=\&quot;\&quot;;&quot;
         &quot;Jet OLEDB:Create System Database=False;&quot;
         &quot;Jet OLEDB:Encrypt Database=False;&quot;
         &quot;Jet OLEDB:Don't Copy Locale on Compact=False;&quot;
         &quot;Jet OLEDB:Compact Without Replica Repair=False;&quot;
         &quot;Jet OLEDB:SFP=False&quot;;
         verbindung-&gt;Open();
         return verbindung;
      }
      catch(Exception *ex)
      {
         return NULL;
      }
   }
   else return verbindung;
}

void verbindungSchliessen()
{
   verbindung-&gt;Close();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1070278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070278</guid><dc:creator><![CDATA[Oliver Kohl]]></dc:creator><pubDate>Fri, 02 Jun 2006 18:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Fri, 02 Jun 2006 19:11:04 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenns denn wahr wäre, wäre ich froh</p>
</blockquote>
<p>Warum sollte es nicht war sein. Solange die DLL im gleichen Ordner wie die EXE ist wird sie gefunden.</p>
<p>String sollte in DLL's nicht als Übergabe oder Rückgabe Parameter genutzt werden, ausgenommen alle beteilitgen Programme includen die Sh.Memory</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070319</guid><dc:creator><![CDATA[Christian211]]></dc:creator><pubDate>Fri, 02 Jun 2006 19:11:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Fri, 02 Jun 2006 19:13:54 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Also zu Problem eins kann ich leider nichts beitragen. (Habe mich auch erst seit kurzem damit beschäftigt).</p>
<p>Zu zwei, wenn die Funktion über extern &quot;C&quot; exportiert wird, wird glaub ich immer ein Unterstrich _ dem Funktionsnamen vorangestellt. Kannst ja mal mit Dependency Walker die DLL anschauen, damit sollte man dies relative schnell sehen.</p>
<p>MfG Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070322</guid><dc:creator><![CDATA[StephanK]]></dc:creator><pubDate>Fri, 02 Jun 2006 19:13:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Fri, 02 Jun 2006 19:23:04 GMT]]></title><description><![CDATA[<p>Hallo und danke erst einmal.</p>
<p>Natürlich ist es soweit klar, dass er die dll findet, wenn sie in dem Verzeichnis der *.exe ist, doch es ist egal, welchen Namen ich angebe, er gibt immer true zurück, auch, wenn ich Blah.dll inkludieren will, die nicht da ist...</p>
<p>Zu dem anderen Problem:<br />
Danke auch dir, doch ich habe mir das &quot;Unterstrich-Problem&quot; auch angeschaut und ausprobiert, es ändert nichts. Die Hilfe auf einschlägigen Seiten ist ein wenig merkwürdig, ich fand folgenden Text:</p>
<blockquote>
<p>// Addresse der Funktion &quot;Addiere&quot; in der DLL herausfinden<br />
// Falls die Funktion nicht gefunden wird, einfach vor den<br />
// Funktionsnamen ein &quot;_&quot; setzen<br />
// Bsp.: statt &quot;Addiere&quot;, &quot;_Addiere&quot; verwenden<br />
DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, &quot;Addiere&quot;);</p>
</blockquote>
<p>Jemand eine weitere Idee?</p>
<p>Oliver.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070329</guid><dc:creator><![CDATA[Oliver Kohl]]></dc:creator><pubDate>Fri, 02 Jun 2006 19:23:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Fri, 02 Jun 2006 19:53:24 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Hast schon mit Dependency Walker oder ähnliches nachgeschaut ob überhaupt eine Funktion exportiert wird, bzw wie der Funktionsname aussieht?</p>
<p>@Christian211</p>
<p>Kannst du noch etwas zum Thema Strings und DLLs bzw dem Sh.Memory sagen?</p>
<p>MfG Stephan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070373</guid><dc:creator><![CDATA[StephanK]]></dc:creator><pubDate>Fri, 02 Jun 2006 19:53:24 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Fri, 02 Jun 2006 19:57:46 GMT]]></title><description><![CDATA[<p>...sagt mir ehrlich gesagt nichts...</p>
<p>Ich werde mich mal schlau machen, was das ist.</p>
<p>Danke dir.</p>
<p>Das String-Problem ist für mich zumindest - denke ich mal - zweitrangig, da es wahrscheinlich die Probleme nicht erklärt, oder liege ich da so falsch?</p>
<p>Oliver.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070376</guid><dc:creator><![CDATA[Oliver Kohl]]></dc:creator><pubDate>Fri, 02 Jun 2006 19:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Fri, 02 Jun 2006 20:12:55 GMT]]></title><description><![CDATA[<p>Hallo StephanK,</p>
<p>hier der - vermutlich interessante - Teil des Dependency Walkers...</p>
<p>Es gibt, do wie ich das sehe, zwei oder drei Funktionen:</p>
<blockquote>
<p>_verbindungSchliessen<br />
_verbindungHerstellen<br />
___CPPdebugHook</p>
</blockquote>
<p>Ansonsten steht dort viel Kram, den ich nicht deuten kann...</p>
<p>Zwei Warnungen habe ich erhalten, die aber glaube ich unwichtig sind.</p>
<blockquote>
<p>Warning: At least one delay-load dependency module was not found.<br />
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.</p>
</blockquote>
<p>Zumindest sind die Funktionsnamen, wie du erwartetest, mit einem vorgestellten Unterstrich versehen...</p>
<p>Oliver.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1070398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070398</guid><dc:creator><![CDATA[Oliver Kohl]]></dc:creator><pubDate>Fri, 02 Jun 2006 20:12:55 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei dynamischem Laden von DLLs on Sat, 03 Jun 2006 04:21:44 GMT]]></title><description><![CDATA[<blockquote>
<p>Kannst du noch etwas zum Thema Strings und DLLs bzw dem Sh.Memory sagen?</p>
</blockquote>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
//   Wichtiger Hinweis zur DLL-Speicherverwaltung, falls die DLL die statische
//   Version der Laufzeitbibliothek (RTL) verwendet:
//
//   Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
//   Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
//   muss die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
//   die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
//   wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
//   auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
//   werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
//   angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
//   sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
//
//   Um die Verwendung von BORLNDMM.DLL, zu vermeiden, sollten String-Informationen als &quot;char *&quot; oder
//   ShortString-Parameter weitergegeben werden.
//
//   Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
//   MEMMGR.LIB nicht explizit angeben.
//---------------------------------------------------------------------------
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1070527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1070527</guid><dc:creator><![CDATA[Christian211]]></dc:creator><pubDate>Sat, 03 Jun 2006 04:21:44 GMT</pubDate></item></channel></rss>