Rückgabe-Wert als double aus C-DLL auslesen

Gast #2015630
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?
#2015819
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.
Persönliche Seite #2015861
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.
Gast #2015871
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren