Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] Dynamische DLL - Funktion nicht gefunden (https://www.delphipraxis.net/143081-%5Bc-%5D-dynamische-dll-funktion-nicht-gefunden.html)

Aurelius 9. Nov 2009 14:52


[C++] Dynamische DLL - Funktion nicht gefunden
 
Hi Leute :hi:

ich habe mich ein wenig an DLLs in C++ versucht und stehe gerade vor folgendem Problem. Die DLL sowie die beiden Testprogramme sind folgendermaßen definiert:

Code:
// Deklaration in DLL-Header
...
__declspec(dllexport) double Addieren(double p_dA, double p_dB);
...
// DLL-CPP
...
double Addieren(double p_dA, double p_dB)
{
   return p_dA + p_dB;
}
...

----------------------------------

//Programm1 - statische Einbindung
__declspec(dllimport) double Addieren(double , double);
...
dErgebnis = Addieren(dA, dB);
...

----------------------------------

//Programm2 - dynamische Einbindung
...
typedef double TAdd (double, double);
...
TAdd   *   Funktion;
HINSTANCE hinstMathe = LoadLibrary(_T("MatheDLL.dll"));
...
Funktion = (TAdd *) GetProcAddress(hinstMathe, "Addieren");
if(Funktion)
{
   dErgebnis = (*Funktion) (dA, dB);
   printf("A + B: %.4lf \n", dErgebnis);
}
...
Die statische Version klappt auch einwandfrei, bei der dynamischen dagegen liefert mir GetProcAddress(hinstMathe, "Addieren") NULL zurück. GetLastError() liefert "127 - Die angegebene Prozedur wurde nicht gefunden". Die DLL wurde aber korrekt geladen (jedenfalls ist der hinstMathe belegt).

Habt ihr eventuell eine Idee woran das liegen könnte?

Entwicklungsumgebung: Visual-C++ 2208

rweinzierl 9. Nov 2009 15:51

Re: [C++] Dynamische DLL - Funktion nicht gefunden
 
Hallo

Schau dir doch mit Dependency Walker die Exportierten Funktionen der DLL einmal an.
Passt Groß und Kleinschreibung ?

mfg

Reinhold

Aurelius 9. Nov 2009 16:38

Re: [C++] Dynamische DLL - Funktion nicht gefunden
 
Die Groß- und Kleinschreibung passt, die Funktionen in der DLL haben die gleiche Schreibweise wie die im Programmbeispiel.

himitsu 9. Nov 2009 16:52

Re: [C++] Dynamische DLL - Funktion nicht gefunden
 
wurde die DLL auch gefunden/geladen?

( was sagt hinstMathe )

Aurelius 9. Nov 2009 17:03

Re: [C++] Dynamische DLL - Funktion nicht gefunden
 
Ich prüfe auf
Code:
HINSTANCE hinstMathe = LoadLibrary(_T("MatheDLL.dll"));
...
if(hinstMathe)
{
  ...
  Funktion = (TAdd *) GetProcAddress(hinstMathe, "Addieren");
  if(Funktion)
  {
     dErgebnis = (*Funktion) (dA, dB);
     printf("A + B: %.4lf \n", dErgebnis);
  }
  ...
}
und im Debugger springt in die Bedingung hinein. Also wird er sie wohl geladen haben (nehm ich jedenfalls stark an :))

Aurelius 9. Nov 2009 19:17

Re: [C++] Dynamische DLL - Funktion nicht gefunden
 
Ich habe ein wenig recherchiert und meinen Code folgendermaßen angepasst:

Code:
// Deklaration in DLL-Header
...
extern "C" __declspec(dllexport) double Addieren(double p_dA, double p_dB);
...
// DLL-CPP
...
double Addieren(double p_dA, double p_dB)
{
   return p_dA + p_dB;
}
...

----------------------------------

//Programm1 - statische Einbindung
extern "C" __declspec(dllimport) double Addieren(double , double);
...
dErgebnis = Addieren(dA, dB);
...
Hiermit funktioniert es, allerdings weiß ich nicht genau warum. Könnt ihr mir das vielleicht erklären? :)

Apollonius 9. Nov 2009 20:51

Re: [C++] Dynamische DLL - Funktion nicht gefunden
 
Klar, name decoration. Intern heißen die Funktionen ein bisschen anders, zum Beispiel werden die Parametertypen in den Namen einkodiert. Extern C vereinfacht diese decoration etwas. Wenn du das nicht verwendest (extern C++), wird deine Funktion unter einem anderen - ziemlich komplizierten - Namen exportiert, den du dir mit diversen Tools auch anschauen kannst.

Aurelius 9. Nov 2009 20:58

Re: [C++] Dynamische DLL - Funktion nicht gefunden
 
Ah, vielen Dank. jetzt bin ich doch um einiges schlauer :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz