Dll einbinden über stdcall -> Absturz
-
Hallo,
ich möchte für eine in C++ geschriebene Dll eine Test.exe erstellen, die Funktionen aus der dll aufruft und die Ergebnisse ausgibt.
Code der test.exe:
#include "Dll_Exports.h" #include <math.h> #include <io.h> #include <iostream> #include <string.h>
int main(int argc, char* argv[]) { double Temp; char buf[10]; Temp = Dll_qx(30, "M","DAV1994_T", 2010,65); printf("qx: %.10f \n",Temp); scanf(buf); return 0; }
In der Headerdatei Dll-Exports.h ist die Funktion Dll_qx, wie folgt deklariert.
double __stdcall Dll_qx(int Alter, char* Sex, char* Tafel, int GebJahr, int Rentenbeginnalter);
und wie folgt definiert.
double __stdcall Dll_qx(int Alter, LPSTR Sex, LPSTR Tafel, int GebJahr, int Rentenbeginnalter) { return get_qx_Wert(Alter, Sex, Tafel, GebJahr, Rentenbeginnalter); }
Wenn ich die Test.exe ausführe, egal ob in der Entwicklungsumgebung oder aus der Kommandozeile, kann das Programm wegen folgender Meldung nicht ausgeführt werden.
"Die Anwendung konnte nicht korrekt gestartet werden (0xc0000142). Klicken Sie auf "OK", um die Anwendung zu schließen.
Hat einer vielleicht eine Idee?
Das Problem taucht erst auf nach dem ich von Visual C++ Studio 2005 auf 2010 Express umgestiegen bin. Vorher hat die Anwendung funktioniert.Viele Grüße und schon mal danke für hilfreiche Antworten
xelan79
-
Brauchst du nicht ein __declspec(dllimport)? Vielleicht steh auf dem Schlauch, aber ich seh hier nicht, wo du angibst, dass die Funktion in einer Dll ist, und in welcher.
-
Danke für die Antwort:
habe versucht mal _dllspec zu verwenden, meine aber verstanden zu haben, dass der Zusatz optional ist. Auf jeden Fall habe ich mit folgender Umsetzung noch dasselbe Problem und die Anwendung stützt mit der u.g. Meldung ab:
Meine Header-Datei Dll-Export.h
#ifndef dll_exports_h #define dll_exports_h #ifdef _EXPORTING #define DLL extern "C" __declspec(dllexport) #else #define DLL extern "C" __declspec(dllimport) #endif DLL double Dll_qx(int Alter, char* Sex, char* Tafel, int GebJahr, int Rentenbeginnalter);
Die Definition habe ich nicht verändert: ....cpp
double Dll_qx(int Alter, LPSTR Sex, LPSTR Tafel, int GebJahr, int Rentenbeginnalter) { return get_qx_Wert(Alter, Sex, Tafel, GebJahr, Rentenbeginnalter); }
In meiner Testanwendung, die die Dll aufrufen soll steht jetzt folgendens:
#include "stdafx.h" // #include "Dll_Exports.h" #include <math.h> #include <io.h> #include <iostream> #include <string.h> extern "C" __declspec(dllimport) double Dll_qx(int Alter, char* Sex, char* Tafel, int GebJahr, int Rentenbeginnalter); int main(int argc, char* argv[]) { double Temp; char buf[10]; Temp = Dll_qx(30, "M","DAV1994_T", 2010,65); printf("qx: %.10f \n",Temp); scanf(buf); return 0; }
Wie gesagt, erscheint derselbe Fehler. Wende ich dllspec richtig an?
-
Und im dll Projekt ist _EXPORTING definiert? Und die dll liegt auch im Pfad wo die exe liegt?
-
Exporting ist definiert, habe aber die Ursache gefunden, meine ich jedenfalls.
Ich erhalte noch folgende Compliler-Warnung:1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(990,5): warning MSB8012: TargetPath(C:\excact\TestTLB\VC.NET\.\Debug\TestTLB.dll) entspricht nicht dem OutputFile-Eigenschaftswert (C:\excact\TestTLB\VC.NET\Debug\KW_CPP.dll) von Linker. Das Projekt wird daher möglicherweise nicht ordnungsgemäß erstellt. Damit dieses Problem behoben werden kann, müssen die Eigenschaftswerte für $(OutDir), $(TargetName) und $(TargetExt) dem in %(Link.OutputFile) angegebenen Wert entsprechen.
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(992,5): warning MSB8012: TargetName(TestTLB) entspricht nicht dem OutputFile-Eigenschaftswert (KW_CPP) von Linker. Das Projekt wird daher möglicherweise nicht ordnungsgemäß erstellt. Damit dieses Problem behoben werdenDie Dateinamen passen nicht zu einander. Kann einer auf die schnelle sagen, wo ich dies einstelle?
-
So, die Warnung kommt nicht mehr, aber daran lag es nicht.
habe jetzt als Ausgabedatei im Linker (TargetName)$(TargetExt) angegeben und $(ProjectName) als Zielname für dll. Das passt jetzt.Ich hab irgendwie, das Gefühl, dass mein Problem nicht mit __declspec zusammenhängt, da das problem mit und ohne _declspec auftritt.
Mit __declspec erhalte ich noch folgende Warnung:
warning C4273: 'Dll_qx': Inkonsistente DLL-Bindung.Muss ich vor die Definition noch
extern "C" __declspec(dllexport)
ergänzen? Das Ergebnis ist mit oder ohne dem Zusatz identisch. Das Programm stürzt mit der fehlermeldung ab:
"Die Anwendung konnte nicht korrekt gestartet werden (0xc0000142). Klicken Sie auf "OK", um die Anwendung zu schließen.
-
Ich habe mal den Dependency Walker über die exe laufen lassen. Er erkennt, dass die Funktion "DLL_qx" keinen Entry-Point hat (Not Bound).
Ich hoffe, dass noch irgendeiner eine idee hat.