<?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[DLL soll string modifizieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem: ich möchte eine DLLFunktion die einen String manipuliert.</p>
<p>dazu hab ich eine funktion in der DLL angelegt die folgendermaßen deklariert ist:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport)

void ModuleInfo2(char* ptr)
{
    //ptr modifizieren
}
</code></pre>
<p>In der DLL Header wird die Funktion exportiert:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport) void ModuleInfo2(char*);
</code></pre>
<p>soweit so gut. Nun hab ich im Hauptprogramm einen Zeiger auf diese Funktion</p>
<pre><code class="language-cpp">typedef						void (WINAPI*ModuleInfo)(char*);
</code></pre>
<p>So nun lade ich die DLL und weise den Zeiger zu</p>
<pre><code class="language-cpp">char		*mi;
ModuleInfo	DLLmodinfo;

HINSTANCE hLib=LoadLibrary(fullpath);
if(hLib==NULL)
{
    printf(&quot; . . . could not load %s\n&quot;,modulename);
} else
{
    DLLmodinfo = (ModuleInfo)GetProcAddress(hLib, &quot;ModuleInfo2&quot;);
    if (!DLLmodinfo==NULL)
    {
        mi = new char[100];
        DLLmodinfo(mi);
        delete [] mi;
    }
    //DLL unloaden usw...
}
</code></pre>
<p>So. und obwohl ich in der DLL Funktion mit dem Zeiger noch überhaupt nichts anstelle, stürzt das Programm wegen diverser Zugriffsverletzungen ab.</p>
<p>Kann mir jemand sagen, wo genau der Fehler ist, bzw mich auf ein schönes Beispiel verweisen, wo DLL Funktionen mit Parametern vielleicht mal etwas allgemeiner abgehandelt werden?</p>
<p><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=":confused:"
      alt="😕"
    /></p>
<p>gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/71082/dll-soll-string-modifizieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 14:29:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/71082.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Apr 2004 17:27:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to DLL soll string modifizieren on Wed, 14 Apr 2004 17:27:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem: ich möchte eine DLLFunktion die einen String manipuliert.</p>
<p>dazu hab ich eine funktion in der DLL angelegt die folgendermaßen deklariert ist:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport)

void ModuleInfo2(char* ptr)
{
    //ptr modifizieren
}
</code></pre>
<p>In der DLL Header wird die Funktion exportiert:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport) void ModuleInfo2(char*);
</code></pre>
<p>soweit so gut. Nun hab ich im Hauptprogramm einen Zeiger auf diese Funktion</p>
<pre><code class="language-cpp">typedef						void (WINAPI*ModuleInfo)(char*);
</code></pre>
<p>So nun lade ich die DLL und weise den Zeiger zu</p>
<pre><code class="language-cpp">char		*mi;
ModuleInfo	DLLmodinfo;

HINSTANCE hLib=LoadLibrary(fullpath);
if(hLib==NULL)
{
    printf(&quot; . . . could not load %s\n&quot;,modulename);
} else
{
    DLLmodinfo = (ModuleInfo)GetProcAddress(hLib, &quot;ModuleInfo2&quot;);
    if (!DLLmodinfo==NULL)
    {
        mi = new char[100];
        DLLmodinfo(mi);
        delete [] mi;
    }
    //DLL unloaden usw...
}
</code></pre>
<p>So. und obwohl ich in der DLL Funktion mit dem Zeiger noch überhaupt nichts anstelle, stürzt das Programm wegen diverser Zugriffsverletzungen ab.</p>
<p>Kann mir jemand sagen, wo genau der Fehler ist, bzw mich auf ein schönes Beispiel verweisen, wo DLL Funktionen mit Parametern vielleicht mal etwas allgemeiner abgehandelt werden?</p>
<p><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=":confused:"
      alt="😕"
    /></p>
<p>gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/501512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/501512</guid><dc:creator><![CDATA[mc_ginley]]></dc:creator><pubDate>Wed, 14 Apr 2004 17:27:08 GMT</pubDate></item><item><title><![CDATA[Reply to DLL soll string modifizieren on Wed, 14 Apr 2004 17:58:34 GMT]]></title><description><![CDATA[<p>Du bringst die Aufrufkonventionen durcheinander.</p>
<p>mc_ginley schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef						void (WINAPI*ModuleInfo)(char*);
</code></pre>
</blockquote>
<p>Es soll also die WINAPI Aufrufkonvention verwendet werden. Das entspricht derzeit __stdcall. Beim Exportieren hast Du aber gar nichts angegeben. Deswegen wird aller Wahrscheinlichkeit nach __cdecl verwendet.</p>
<p>Also mußt Du das <em>WINAPI</em> auch in Deiner Funktion angeben:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport)

void WINAPI ModuleInfo2(char* ptr)
{
    //ptr modifizieren
}
</code></pre>
<p>Und:</p>
<pre><code class="language-cpp">extern &quot;C&quot; __declspec(dllexport) void WINAPI ModuleInfo2(char*);
</code></pre>
<p>Wenn Du allerdings den VC verwendest, wird Dir spätestens der Aufruf von GetProcAddress NULL zurückgeben. Das liegt an der internen Darstellungsweise von __stdcall-Funktionen. Dabei wird der Funktionsname modifiziert. Damit die Funktion trotzdem unter diesem Namen exportiert werden, legst Du ein alias an. Das geschieht in dem Def-File, das Du einfach dem Projekt hinzufügst:</p>
<pre><code>EXPORTS
  ModuleInfo2
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/501530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/501530</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Wed, 14 Apr 2004 17:58:34 GMT</pubDate></item><item><title><![CDATA[Reply to DLL soll string modifizieren on Wed, 14 Apr 2004 22:42:59 GMT]]></title><description><![CDATA[<p>hat funktioniert, besten dank! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>kannst du mir vielleicht noch ein paar infos zu diesem __declspec geben? was das soll, bzw was das bewirkt? das kommt mir alles so abstrakt vor.</p>
<p>gruß und besten dank <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/501667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/501667</guid><dc:creator><![CDATA[mc_ginley]]></dc:creator><pubDate>Wed, 14 Apr 2004 22:42:59 GMT</pubDate></item><item><title><![CDATA[Reply to DLL soll string modifizieren on Thu, 15 Apr 2004 07:04:41 GMT]]></title><description><![CDATA[<p>Vielleicht ist das für dich interessant: <a href="http://www.resourcecode.de/view.php?id=776" rel="nofollow">http://www.resourcecode.de/view.php?id=776</a> <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/501762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/501762</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Thu, 15 Apr 2004 07:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to DLL soll string modifizieren on Thu, 15 Apr 2004 10:02:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn Du allerdings den VC verwendest, wird Dir spätestens der Aufruf von GetProcAddress NULL zurückgeben. Das liegt an der internen Darstellungsweise von __stdcall-Funktionen. Dabei wird der Funktionsname modifiziert.</p>
</blockquote>
<p>IMHO wird das doch schon durch das extern &quot;C&quot; verhindert das der Funktionsname geändert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/501855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/501855</guid><dc:creator><![CDATA[..]]></dc:creator><pubDate>Thu, 15 Apr 2004 10:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to DLL soll string modifizieren on Thu, 15 Apr 2004 10:05:46 GMT]]></title><description><![CDATA[<p>Sorry. War falsch. Das galt nur für __cdecl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/501858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/501858</guid><dc:creator><![CDATA[..]]></dc:creator><pubDate>Thu, 15 Apr 2004 10:05:46 GMT</pubDate></item></channel></rss>