<?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[Funktionsaufruf auf andere DLL aus DLL heraus]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>mein kleines Programm scheint nicht zu laufen - ich vermutet einen Fehler in der Funktionsdeklaration bzw. im Funktionsaufruf.</p>
<p>Folgende Situation:</p>
<p>Es wird auf eine DLL zugegriffen, bzw. auf deren Funktion EXPORT.<br />
In der Funktion wird auf eine andere DLL verwiesen (DLL1). Diese hat 2 Funkionen - INIT und CTRL, die nach CDECL calling convention folgendermassen definiert sind:</p>
<pre><code>void INIT(double *array1, double *array2);
void CTRL double *array1, double *array2);
</code></pre>
<p>Nachfolgend der Quellcode meiner DLL mit der Funktion EXPORT:</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;windows.h&gt;

typedef void (__cdecl *CTRL)(double*, double*);
typedef void (__cdecl *INIT)(double*, double*);

double dll1_in_array1[101]; //je ein Array für Input und Output               
double dll1_out_array1[101]; //und je Funktion.	
double dll1_in_array2[101]; //diese werden später and die Funktionen 
double dll1_out_array2[101]; //übergeben

INIT call_dll1_Init;
CTRL call_dll1_Ctrl;

HINSTANCE hinstlib_dll1= LoadLibrary(L&quot;DLL1.dll&quot;);		

extern &quot;C&quot; {
void __declspec(dllexport) __cdecl EXPORT(float *var1,int *var2, char *var3, char *var4, char *var5);}

void __declspec(dllexport) __cdecl EXPORT(float *var1,int *var2, char *var3, char *var4, char *var5)
{

call_dll1_Init=(INIT)GetProcAddress(hinstlib_dll1,&quot;INIT&quot;);	

call_dll1_Ctrl=(CTRL)GetProcAddress(hinstlib_dll1,&quot;CTRL&quot;);	 

.
.
.

call_dll1_Init(dll1_in_array1,dll1_out_array1);	 //Aufruf der Funktionen  

call_dll1_Ctrl(dll1_in_array2,dll1_out_array2);		
.
.
.
</code></pre>
<p><strong>Der tiefere Sinn ist also, die Arrays and die DLL zu schicken, wo das inputarray benutzt wird, um das outputarray mit Daten zu &quot;betanken&quot;.</strong></p>
<p>Das Einbindung klappt hervorragend, augescheinlich scheint auch der Funktionsaufruf, z.B.</p>
<pre><code>call_dll1_Init(dll1_in_array1,dll1_out_array1);
</code></pre>
<p>zu funktionieren.</p>
<p>ich bin mir jedoch unsicher, ob für die cdecl calling convention</p>
<pre><code>void INIT(double *array1, double *array2);
</code></pre>
<p>die Deklaration</p>
<pre><code>typedef void (__cdecl *INIT)(double*, double*);
</code></pre>
<p>die richtige ist, zumal bei z.B.</p>
<pre><code>typedef void (__cdecl *CTRL)(double *input, double *output);
</code></pre>
<p>auch keine Fehlermeldungen auftreten</p>
<p>Danke für die Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270222/funktionsaufruf-auf-andere-dll-aus-dll-heraus</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 12:51:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270222.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Jul 2010 14:10:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsaufruf auf andere DLL aus DLL heraus on Thu, 08 Jul 2010 15:41:42 GMT]]></title><description><![CDATA[<p>Hallo Gemeinde,</p>
<p>mein kleines Programm scheint nicht zu laufen - ich vermutet einen Fehler in der Funktionsdeklaration bzw. im Funktionsaufruf.</p>
<p>Folgende Situation:</p>
<p>Es wird auf eine DLL zugegriffen, bzw. auf deren Funktion EXPORT.<br />
In der Funktion wird auf eine andere DLL verwiesen (DLL1). Diese hat 2 Funkionen - INIT und CTRL, die nach CDECL calling convention folgendermassen definiert sind:</p>
<pre><code>void INIT(double *array1, double *array2);
void CTRL double *array1, double *array2);
</code></pre>
<p>Nachfolgend der Quellcode meiner DLL mit der Funktion EXPORT:</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;windows.h&gt;

typedef void (__cdecl *CTRL)(double*, double*);
typedef void (__cdecl *INIT)(double*, double*);

double dll1_in_array1[101]; //je ein Array für Input und Output               
double dll1_out_array1[101]; //und je Funktion.	
double dll1_in_array2[101]; //diese werden später and die Funktionen 
double dll1_out_array2[101]; //übergeben

INIT call_dll1_Init;
CTRL call_dll1_Ctrl;

HINSTANCE hinstlib_dll1= LoadLibrary(L&quot;DLL1.dll&quot;);		

extern &quot;C&quot; {
void __declspec(dllexport) __cdecl EXPORT(float *var1,int *var2, char *var3, char *var4, char *var5);}

void __declspec(dllexport) __cdecl EXPORT(float *var1,int *var2, char *var3, char *var4, char *var5)
{

call_dll1_Init=(INIT)GetProcAddress(hinstlib_dll1,&quot;INIT&quot;);	

call_dll1_Ctrl=(CTRL)GetProcAddress(hinstlib_dll1,&quot;CTRL&quot;);	 

.
.
.

call_dll1_Init(dll1_in_array1,dll1_out_array1);	 //Aufruf der Funktionen  

call_dll1_Ctrl(dll1_in_array2,dll1_out_array2);		
.
.
.
</code></pre>
<p><strong>Der tiefere Sinn ist also, die Arrays and die DLL zu schicken, wo das inputarray benutzt wird, um das outputarray mit Daten zu &quot;betanken&quot;.</strong></p>
<p>Das Einbindung klappt hervorragend, augescheinlich scheint auch der Funktionsaufruf, z.B.</p>
<pre><code>call_dll1_Init(dll1_in_array1,dll1_out_array1);
</code></pre>
<p>zu funktionieren.</p>
<p>ich bin mir jedoch unsicher, ob für die cdecl calling convention</p>
<pre><code>void INIT(double *array1, double *array2);
</code></pre>
<p>die Deklaration</p>
<pre><code>typedef void (__cdecl *INIT)(double*, double*);
</code></pre>
<p>die richtige ist, zumal bei z.B.</p>
<pre><code>typedef void (__cdecl *CTRL)(double *input, double *output);
</code></pre>
<p>auch keine Fehlermeldungen auftreten</p>
<p>Danke für die Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1923340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1923340</guid><dc:creator><![CDATA[DampfHans]]></dc:creator><pubDate>Thu, 08 Jul 2010 15:41:42 GMT</pubDate></item></channel></rss>