Dll mit VS
-
Hallo zusammen!
Da ich folgenden Beitrag ausversehen zu erst im falschen Forum gepostet habe, hier mein zweiter Versuch:Ich fass mich so kurz wie möglich: Benutze Visual Studio 2005 Prof.Edition und möchte in einem C++-Projekt eine DLL erstellen.
Dabei rufe ich eine andere DLL auf, die unter Eclipse CDT geschrieben ist (Ansi C++).DLL wird beim Linken durch "Zusätzliche Abhängigkeiten" eingebunden. Beim Linken bekomme ich dennoch die Fehlermdeldung: Ungültige oder beschädigte Datei: Lesen bei ADRESSE nicht möglich.
Google sagt mir, dass man die .lib-Datei einbinden soll und diese dann auf die DLL zugreift.
Nur leider habe ich keine .lib von meiner DLL da ich die DLL ja via Eclipse erstelle.
Kann ich trotzdem irgendwie die DLL aufrufen? Weiß jemand Rat?
Grüße Stefan
-
Wenn du die Signaturen der exportierten Funktionen kennst, kannst du mit LoadLibrary, GetProcAddress (und nachher dann FreeLibrary) die DLL dynamisch zur Laufzeit laden.
-
ok, habe ich gemacht! Bei mir sieht eine Funktion ohne Übergabeparameter so aus:
void Wrapper_Class::callPrint() { hLibrary = LoadLibrary("name.dll"); pFunc = GetProcAddress(hLibrary, "_ZN4pmdm24Magnetostatic_Simulation8printoutEv"); (*pFunc)(); FreeLibrary(hLibrary); }
Aber jetzt mal vielleicht doofe Frage: Wie mache ich das bei Funktionen mit Übergabeparametern?
-
pFunc muss den passenden Typ haben, dann ist das kein Problem:
typedef void (*pFuncIV)(int); // int->void typedef int (*pFuncII)(int); // int->int typedef int (*pFuncVI)(); // void->int pFuncIV iv; pFuncII ii; pFuncVI vi; iv = (pFuncIV)GetProcAddress(hLibrary, "IntVoid"); ii = (pFuncII)GetProcAddress(hLibrary, "IntInt"); vi = (pFuncVI)GetProcAddress(hLibrary, "VoidInt"); // läuft immer gleich ab, nur der typ unterscheidet sich //aufrufen geht wie mit jeder anderen funktion auch: iv(42); int number = ii(23); int number2 = vi();
-
jupp danke dir! habs 5min bevor ich deinen Post gesehen habe im I-Net gefunden.
bloß bei mir gibts immer eine "Unbehandelte Ausnahme" bzw "Zugriffsverletzung beim Lesen" wenn ich meine Fkt print(zahl) (was bei dir iv(42) ist) aufrufe