Forum: PC-Programmierung Rückgabe-Wert als double aus C-DLL auslesen


von Steffen (Gast)


Lesenswert?

hallo,

ich schreibe mit einem Freund zusammen ein Programm. Er schreibt eine 
DLL-Datei und ich schreibe das Hauptprogramm. Die DLL liefert einen 
floating-Wert zurück. In meinem Programm kommt allerdings kein 
floating-Wert an, sondern ein INT oder LONG - also Ganzzahl.
Bei Aufruf der Funktion in der DLL wird der double Wert auf dem 
Bildschirm ausgegeben. Da ist es noch eine Gleitkommazahl.
Die Initialisierung der DLL sieht so aus:
1
_Division_Berechnen (unsigned long *Zaehler, unsigned long *Nenner, double *result_div, int Stelle)
2
   {
3
      typedef double (CALLBACK *LPWSTR)(unsigned long *, unsigned long *, double *, int);
4
      LPWSTR p;
5
      p = (LPWSTR)GetProcAddress(hDLL,"_DLL_Division");
6
      if (!p)
7
      {
8
         printf ("\nFormel in DLL nicht gefunden!\n\n");
9
         exit(-1);
10
      }
11
      else
12
      {
13
         return (p)(Zaehler, Nenner, result_div, Stelle);
14
      }
15
   }

Was könnte ich falsch machen, dass der floating-Wert als Ganzzahl-Wert 
übergeben wird?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was steht vor "_Division_Berechnen"?

von Karl H. (kbuchegg)


Lesenswert?

Steffen schrieb:

> floating-Wert zurück. In meinem Programm kommt allerdings kein
> floating-Wert an, sondern ein INT oder LONG - also Ganzzahl.

Woher weißt du das.

Der Zahlenwert wird ganz sicher nicht von irgendjemanden zwischendurch 
verändert.
Entweder dein Freund hat sich irgendwo vertan und sich einen cast auf 
eine Ganzzahl eingehandelt oder deine Ausgabe ist ganz einfach falsch 
programmiert.

Beides hat aber mit dem gezeigten Code nichts zu tun, sondern du musst 
auf DLL Seite den Code ansehen oder aber was du mit dem Ergbenis-Wert 
weiter machst.

von Aus Interesse (Gast)


Lesenswert?

Hi,
schau mal hier 
http://c-buch.sommergut.de/Kapitel10/Verwendung-von-R%FCckgabewerten-und-Prototypen.shtml 
.

Nur aus reiner Neugier: Warum stellts Du die Verknüpfung zu Deiner Dll 
explizit her?

Gruss

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein Grund dafür könnte sein, daß mehrere DLLs mit gleichem Interface 
wechselweise geladen und genutzt werden sollen - man denke an ein 
"Plugin"-Modell.
Das lässt sich über Importlibraries nicht nutzen, auch ist eine 
softwareseitige Behandlung von Fehlern (DLL nicht da, falsche Version 
o.ä.) dann nicht möglich, weil der Programmlader das Programm erst dann 
startet, wenn alle erforderlichen DLLs vorhanden sind.

von Aus Interesse (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Ein Grund dafür könnte sein, daß mehrere DLLs mit gleichem Interface
> wechselweise geladen und genutzt werden sollen - man denke an ein
> "Plugin"-Modell.
> Das lässt sich über Importlibraries nicht nutzen, auch ist eine
> softwareseitige Behandlung von Fehlern (DLL nicht da, falsche Version
> o.ä.) dann nicht möglich, weil der Programmlader das Programm erst dann
> startet, wenn alle erforderlichen DLLs vorhanden sind.

Da hast Du natürlich völlig recht. Allerdings war die Frage eher als Tip 
meinerseits gedacht. Das fehlende "double" zeigt mir, dass mit grösster 
Wahrscheinlichkeit kein Plugin-Modell genutzt wird.

Viele Grüsse

von Steffen (Gast)


Lesenswert?

super, es hat geklappt. Es hat das "DOUBLE" vor der 
Initialisierung/Funktionsaufruf gefehlt.

von Nico S. (nico22)


Lesenswert?

Man merke, der Standard-Rückgabewert in C ist ein int.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der Compiler hätte hier allerdings eine Warnung ausgeben müssen. Hat er 
vermutlich auch, aber das Ignorieren von Warnungen von C-Compilern gilt 
ja als "sportlich".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.