DLL Einbinden
-
Hallo rya,
Visual Studio erstellt die automatisch wenn man über ein .def-file die Funktionen exportiert oder per __declspec(dllexport), das gilt aber nur, wenn man selbst eine DLL schreibt.
habe es gerade mal getestet; das läuft soweit, erst einmal thx dafür
Wird die *.lib im Projektordner eigendlich automatisch erkannt? (habe keinen Eintrag "dll.lib" in irgendwelchen Projekteinstellungen gefunden)
Soweit so gut...
Aber kann man nicht auch Funktionen einer DLL ohne einer zusätzlichen *.lib benutzen?
Das war mitAllerdings gibt es dort eine *.lib. Wie bekomme ich die da heraus?
gemeint (sry, war ein wenig unpräziese)
MfG
cluehre
-
cluehre schrieb:
Soweit so gut...
Aber kann man nicht auch Funktionen einer DLL ohne einer zusätzlichen *.lib benutzen?Ja kann man. Dann muß man die dll dynamische laden. Siehe dazu
LoadLibrary, GetProcAddress etc.
-
Hallo Braunstein,
Siehe dazu LoadLibrary, GetProcAddress etc.
habe dazu folgenden Code geschrieben
Erstellen der DLL
#include <windows.h> #include "stdafx.h" extern"C" _declspec(dllexport) int add (int a, int b); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } int add (int a, int b) { return a + b; }Nutzen der DLL (speziell die add - Fnktion)
#include "stdafx.h" #include <stdio.h> #include <windows.h> typedef int (CALLBACK* DLLFUNC)(int, int); int __declspec (dllimport) add (int a, int b); DLLFUNC DllFunc1; void main(int argc, char* argv[]) { int a=1; int b=2; HMODULE hMod=LoadLibrary("dll"); if (hMod==NULL){ printf("Keine DLL gefunden"); } DllFunc1 = (DLLFUNC)GetProcAddress(hMod, "add"); if (!DllFunc1){ printf("Keine \"add\" - Funktion gefunden"); }else{ printf("Aufruf"); a=DllFunc1(a,b); } FreeLibrary (hMod); }Das Problem ist das die add - Funktion nicht gefunden wird.(das printf in Zeile26 wird ausgeführt) Sieht evtl. jemand den Grund?
MfG
cluehre
-
Richtig wäre:
extern "C"
int add (int a, int b)
{
return a + b;
}rya.
-
moin zusammen,
thx scorer habes es zum laufen bekommen.
Nun habe ich die Problematik ne ganze Klasse in ne DLL bekommen zu müssen.
Stumpf
extern"C" _declspec(dllexport)geht leider nicht

Muss man da was besonders beachten?
Ich denke diesesBOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call,LPVOID lpReserved) {return TRUE;}muss durch irgendetwas ersetzt werden.
Nochwas:
- Die Klasse muss dynamisch aufrufbar sein.
- Kompilerkompatibilitäten sind kein Problem.
- Benutze Visual C++ 6.0Thx für alles was euch dazu einfällt
MfG cluehre
-
Output fetched:
-
ohmg... nette animation die du da rausgekramt hast...die kannte ich noch nicht^^
wenn noch jemand was hat, was weiterhelfen könnte bin ich sehr dankbar
MfG cluehre
-
Naja, das beste ist, du legst im allgemeinen Header von deiner DLL erstmal ein Makro an ( ich hoffe du hast so nen Uberheader, wenn nicht mach dir einen :p )
#if defined(MYPROJECT_EXPORTS) && defined(WIN32) // <- das kannst du nennen wie du es willst, muss aber bei der DLL in den Präprozessor #define MY_EXPORT __declspec(dllexport) #elif defined(WIN32) #define MY_EXPORT _declspec(dllimport) #endif /* EXPORT */ [cpp] Das macht man, damit automatisch entschieden wird, imported oder exported wird. Dann sollte das so gehen: [cpp] extern "C" MY_EXPORT int foobar(int a, int b);Alternativ kannst du ohne _declspec aus einer .def-Datei exportieren, die du beim linken angibst:
EXPORT add @1EXPORT muss oben hin, das heisst, dass exportiert wird.
add @1 heisst, dass add als erste funktion exportiert wird. In dem Fall reicht die Deklaration von add mit:int add(int a, int b);Und ja, da kann man dann auch Klassen exportieren. Man darf es aber auf keinen Fall in C-Code dann verwenden.
HTH
rya.
-
Hallo
thx @scorcher24 hast mir sehr weitergeholfen.
warscheinlich habe ich das soweit hinbekommen; der Compiler ist zumindest einverstanden.Das Problem ist das ich die Klasse nicht mehr aus der DLL bekomme; die Klasse also in meinem Hauptprogramm nicht verwenden kann.
Mit GetProgAddress get es ja nicht. Gibt es eine äquivalente Funktion/Strategie für Klassen?
Oder geht sowas überhapt nicht, bzw. ist schlecht umsetzbar.Hat jemand nen Strategieänderung? Bin für alles offen.
*sry wegen der ganzen dummen fragen, bin ein newbie was die Thematik angeht*
MfG
-
Wie ich bereits schrieb: Es ist egal ob du Klassen oder Werte zurückgibst. Wenn du eine Funktion aus einer DLL manuell lädst, ist nur der Name wichtig. Du musst halt wissen, was diese Funktion zurückgibt.
http://www.google.de/search?hl=de&ei=tgCVSarxBM-n-gbJm7yOCQ&sa=X&oi=spell&resnum=1&ct=result&cd=1&q=how+to+export+from+a+dll+on+windows&spell=1
rya.