<?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[Laden einer C-DLL - Aurfruf einer Funktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade ein kleines Konsolen-Programm, welches auf ein DLL eines Drittanbieters zugreifen soll.</p>
<p>Ich dachte eigentlich das mein Code nicht unbedingt ganz sauber aber ok ist, leider stürtzt die DLL scheinbar beim Aufruf einer der Funktionen ab.</p>
<p>Doku Anbieter:</p>
<blockquote>
<p>Die Schnittstelle der DLL exportiert folgende Funktionen:</p>
<p>#define DLLCALL(typ) __declspec(dllexport) typ _cdecl</p>
<p>extern &quot;C&quot; {<br />
DLLCALL(int) initXML(void);<br />
DLLCALL(int) initDB(char *strCon);<br />
DLLCALL(int) doXML(char *inStream, char *outStream);<br />
}</p>
</blockquote>
<p>Der Aufruf der initXML() und initDB() funktioniert auch noch (sieht man im Logfile der DLL). Beim Aufruf der doXML() Stürtzt die DLL ab. Die Frage ist eigentlich ob ich schon beim Laden oder importieren der Funktionen einen Fehler mache.</p>
<pre><code>int _tmain(int argc, _TCHAR* argv[]) {

	char*	request;
	char*	answer;

	typedef int		(*ptrinitXML)(void);
	typedef int		(*ptrinitDB)(char *strCon);
	typedef int		(*ptrdoXML)(char *inStream, char *outStream);

	ptrinitXML		MinitXML;
	ptrinitDB		MinitDB;
	ptrdoXML		MdoXML;

    HINSTANCE DLL = NULL;
	DLL = LoadLibrary(_T(&quot;init.dll&quot;));

	request = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot; ?&gt;&lt;REQUEST&gt;&lt;COMMAND&gt;Find&lt;/COMMAND&gt;&lt;DATA&gt;&lt;KUNDE&gt;Meier&lt;/KUNDE&gt;&lt;LAND&gt;DE&lt;/LAND&gt;&lt;/DATA&gt;&lt;/REQUEST&gt;&quot;;

    if (DLL)
    {
		MinitXML		= (ptrinitXML)GetProcAddress(DLL, &quot;initXML&quot;);
		MinitDB	= (ptrinitDB)GetProcAddress(DLL, &quot;initDB&quot;);
		MdoXML		= (ptrpdoXML)GetProcAddress(DLL, &quot;doXML&quot;);

		MinitXML();
		MinitDB(&quot;Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\test\\test.mdb&quot;);

		MdoXML(request,answer);
		FreeLibrary(DLL);
    }

	getch();

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/179637/laden-einer-c-dll-aurfruf-einer-funktion</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 18:50:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179637.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Apr 2007 06:25:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Laden einer C-DLL - Aurfruf einer Funktion on Tue, 24 Apr 2007 06:25:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade ein kleines Konsolen-Programm, welches auf ein DLL eines Drittanbieters zugreifen soll.</p>
<p>Ich dachte eigentlich das mein Code nicht unbedingt ganz sauber aber ok ist, leider stürtzt die DLL scheinbar beim Aufruf einer der Funktionen ab.</p>
<p>Doku Anbieter:</p>
<blockquote>
<p>Die Schnittstelle der DLL exportiert folgende Funktionen:</p>
<p>#define DLLCALL(typ) __declspec(dllexport) typ _cdecl</p>
<p>extern &quot;C&quot; {<br />
DLLCALL(int) initXML(void);<br />
DLLCALL(int) initDB(char *strCon);<br />
DLLCALL(int) doXML(char *inStream, char *outStream);<br />
}</p>
</blockquote>
<p>Der Aufruf der initXML() und initDB() funktioniert auch noch (sieht man im Logfile der DLL). Beim Aufruf der doXML() Stürtzt die DLL ab. Die Frage ist eigentlich ob ich schon beim Laden oder importieren der Funktionen einen Fehler mache.</p>
<pre><code>int _tmain(int argc, _TCHAR* argv[]) {

	char*	request;
	char*	answer;

	typedef int		(*ptrinitXML)(void);
	typedef int		(*ptrinitDB)(char *strCon);
	typedef int		(*ptrdoXML)(char *inStream, char *outStream);

	ptrinitXML		MinitXML;
	ptrinitDB		MinitDB;
	ptrdoXML		MdoXML;

    HINSTANCE DLL = NULL;
	DLL = LoadLibrary(_T(&quot;init.dll&quot;));

	request = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot; ?&gt;&lt;REQUEST&gt;&lt;COMMAND&gt;Find&lt;/COMMAND&gt;&lt;DATA&gt;&lt;KUNDE&gt;Meier&lt;/KUNDE&gt;&lt;LAND&gt;DE&lt;/LAND&gt;&lt;/DATA&gt;&lt;/REQUEST&gt;&quot;;

    if (DLL)
    {
		MinitXML		= (ptrinitXML)GetProcAddress(DLL, &quot;initXML&quot;);
		MinitDB	= (ptrinitDB)GetProcAddress(DLL, &quot;initDB&quot;);
		MdoXML		= (ptrpdoXML)GetProcAddress(DLL, &quot;doXML&quot;);

		MinitXML();
		MinitDB(&quot;Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\test\\test.mdb&quot;);

		MdoXML(request,answer);
		FreeLibrary(DLL);
    }

	getch();

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1272140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272140</guid><dc:creator><![CDATA[Ueberflasher]]></dc:creator><pubDate>Tue, 24 Apr 2007 06:25:42 GMT</pubDate></item><item><title><![CDATA[Reply to Laden einer C-DLL - Aurfruf einer Funktion on Tue, 24 Apr 2007 07:03:29 GMT]]></title><description><![CDATA[<p>Du hast auf jeden Fall vergessen, Speicher für die Ausgabe zu reservieren - das heißt answer zeigt irgendwo in den RAM (und an der Stelle darfst du mit hoher Wahrscheinlichkeit nichts hinschreiben). Davon abgesehen kommt mir eine Funktion suspekt vor, die ohne Größenkontrolle in ein char-Array schreiben darf (doXML() sollte imho noch eine Angabe bekommen, wieviel Platz sie hinter 'outStream' zur Verfügung hat).</p>
<p>PS: Wenn du der Meinung bist, das Laden der Funktionen ist schon schief gegangen, solltest du die Rückgabewerte der GetProcAdress()-Aufrufe auswerten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272157</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Apr 2007 07:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Laden einer C-DLL - Aurfruf einer Funktion on Tue, 24 Apr 2007 09:32:14 GMT]]></title><description><![CDATA[<p>Hallo Es muss natürlich heissen:</p>
<pre><code>#define DLLCALL(typ) __declspec(dllexport) typ _cdecl

extern &quot;C&quot; {
DLLCALL(int) initXML(void);
DLLCALL(int) initDB(char *strCon);
DLLCALL(int) doXML(char *inStream,int inLen, char *outStream, int *outLen, int maxLen);
}
</code></pre>
<pre><code>int _tmain(int argc, _TCHAR* argv[]) {

    char*    request = new char[1000];
    char*    answer = new char[1000];
	int		inLen;
	int*	outLen = new int;

    typedef int        (*ptrinitXML)(void);
    typedef int        (*ptrinitDB)(char *strCon);
    typedef int        (*ptrdoXML)(char *inStream, char *outStream);

    ptrinitXML        MinitXML;
    ptrinitDB        MinitDB;
    ptrdoXML        MdoXML;

    HINSTANCE DLL = NULL;
    DLL = LoadLibrary(_T(&quot;init.dll&quot;));

    request = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot; ?&gt;&lt;REQUEST&gt;&lt;COMMAND&gt;Find&lt;/COMMAND&gt;&lt;DATA&gt;&lt;KUNDE&gt;Meier&lt;/KUNDE&gt;&lt;LAND&gt;DE&lt;/LAND&gt;&lt;/DATA&gt;&lt;/REQUEST&gt;&quot;;

    if (DLL)
    {
        MinitXML        = (ptrinitXML)GetProcAddress(DLL, &quot;initXML&quot;);
        MinitDB    = (ptrinitDB)GetProcAddress(DLL, &quot;initDB&quot;);
        MdoXML        = (ptrpdoXML)GetProcAddress(DLL, &quot;doXML&quot;);

        MinitXML();
        MinitDB(&quot;Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\test\\test.mdb&quot;);

        MdoXML(request,1000,answer,outLen,1000);
		delete []request;
		delete []answer;
        FreeLibrary(DLL);
    }

    getch();

    return 0;
}
</code></pre>
<p>Hatte den Code etwas abgespeckt. Hab alles rausgeschmissen wovon ich dachte es sei nicht relevant.</p>
<p>Kommt aber immer noch nen Fehler. Wie bekomme ich die genau Länge von request.<br />
sizeof() geht da nicht. Wenn request leer bleibt, dann stürzt er nicht ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272257</guid><dc:creator><![CDATA[Ueberflasher]]></dc:creator><pubDate>Tue, 24 Apr 2007 09:32:14 GMT</pubDate></item><item><title><![CDATA[Reply to Laden einer C-DLL - Aurfruf einer Funktion on Tue, 24 Apr 2007 09:39:50 GMT]]></title><description><![CDATA[<p>Nur mal ein Ausschnitt:</p>
<blockquote>
<pre><code class="language-cpp">char*    request = new char[1000];//reserviert Speicher
request = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot; ?&gt;&lt;REQUEST&gt;&lt;COMMAND&gt;Find&lt;/COMMAND&gt;&lt;DATA&gt;&lt;KUNDE&gt;Meier&lt;/KUNDE&gt;&lt;LAND&gt;DE&lt;/LAND&gt;&lt;/DATA&gt;&lt;/REQUEST&gt;&quot;;//verbiegt den Zeiger auf's Data-Segment
//-&gt;Speicherleck
delete []request;//delete't Speicherbereiche außerhalb des Heaps
//-&gt;Crash
</code></pre>
</blockquote>
<p>So etwas kann nicht gut gehen. Entweder du lässt die Speicherverwaltung für request komplett weg (sowohl das new[] als auch das delete[]) oder du ersetzt die Zuweisung durch einen strcpy()-Aufruf.</p>
<p>Ansonsten: Die Länge kannst du per strlen() bestimmen.</p>
<p>PS: Und ich würde mich bemühen, soweit wie möglich auf nackte Zeiger und char-Arrays zu verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272262</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Apr 2007 09:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to Laden einer C-DLL - Aurfruf einer Funktion on Tue, 24 Apr 2007 09:52:19 GMT]]></title><description><![CDATA[<p>Hallo Danke für die Hilfe, aber noch stimmt was nicht:</p>
<pre><code>int _tmain(int argc, _TCHAR* argv[]) {

    char*    request;
    char*    answer = new char[1000];
    int        inLen;
    int*    outLen = new int;

    typedef int        (*ptrinitXML)(void);
    typedef int        (*ptrinitDB)(char *strCon);
    typedef int        (*ptrdoXML)(char *inStream, char *outStream);

    ptrinitXML        MinitXML;
    ptrinitDB        MinitDB;
    ptrdoXML        MdoXML;

    HINSTANCE DLL = NULL;
    DLL = LoadLibrary(_T(&quot;init.dll&quot;));

    request = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;ISO-8859-1\&quot; ?&gt;&lt;REQUEST&gt;&lt;COMMAND&gt;Find&lt;/COMMAND&gt;&lt;DATA&gt;&lt;KUNDE&gt;Meier&lt;/KUNDE&gt;&lt;LAND&gt;DE&lt;/LAND&gt;&lt;/DATA&gt;&lt;/REQUEST&gt;&quot;;
    inLen = strlen(request);

    if (DLL)
    {
        MinitXML        = (ptrinitXML)GetProcAddress(DLL, &quot;initXML&quot;);
        MinitDB    = (ptrinitDB)GetProcAddress(DLL, &quot;initDB&quot;);
        MdoXML        = (ptrpdoXML)GetProcAddress(DLL, &quot;doXML&quot;);

        MinitXML();
        MinitDB(&quot;Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\test\\test.mdb&quot;);

        MdoXML(request,inLen,answer,outLen,1000);
        delete []answer;
        FreeLibrary(DLL);
    }

    getch();

    return 0;
}
</code></pre>
<p>Oder hab ich das flasch vertsanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272269</guid><dc:creator><![CDATA[Ueberflasher]]></dc:creator><pubDate>Tue, 24 Apr 2007 09:52:19 GMT</pubDate></item><item><title><![CDATA[Reply to Laden einer C-DLL - Aurfruf einer Funktion on Tue, 24 Apr 2007 10:05:05 GMT]]></title><description><![CDATA[<p>Durchaus möglich. Aber für weitere Hilfen solltest du mal verraten, was für ein Fehler aufgetreten ist (und wie du es geschafft hast, 5 Parameter an eine Funktion zu übergeben, die nur zwei erwartet ;)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272275</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 24 Apr 2007 10:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to Laden einer C-DLL - Aurfruf einer Funktion on Tue, 24 Apr 2007 11:01:04 GMT]]></title><description><![CDATA[<p>Das Abspecken hab ich natürlich nur für den Post gemacht. Die Funktion hat schon immer alle Parameter bekommen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Fehler wenn ich driekt aufrufe:</p>
<blockquote>
<p>DLLKernel.exe hat ein Problem festgestellt und muss beendet werden.<br />
...</p>
</blockquote>
<p>Standard Windows Meldung halt.</p>
<p>Im VS2005:</p>
<blockquote>
<p>Unbehandelte Ausnahme bei 0x10020a54 DLLKernel.exe:<br />
0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x004021ed.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1272292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272292</guid><dc:creator><![CDATA[Ueberflasher]]></dc:creator><pubDate>Tue, 24 Apr 2007 11:01:04 GMT</pubDate></item></channel></rss>