DLL schreiben unter C
-
eine Funktion die besser DllMain heißen sollte

-
achso alles klar.
-
Das ist die besagte Funktion mit der du in der DLL auf bestimmte Ereignisse reagieren kannst (vollständige Auflistung siehe MSDN). Aber ein einfaches "return TRUE" reicht zu Beginn meistens

BTW: Ja, sollte DllMain() heißen, LibMain() ist afaik eine Abwandlung vom BCB.
MfG SideWinder
-
achso dann kann ich es ja so übrnehmen.
danke für antwort

Ich geschlafen.mfg.
Stefan
-
Ich häng' mich hier mal ran, k?

Gibt es DLLs nur unter Windows, oder ist das ein Feature von C++ und universell einsetzbar?
Ich frage deshalb, weil ich bisher immer nur in Verbindung mit Windows von DLLs gehört habe und ich unter Linux (oder anderen Systemen) noch nie entwickelt habe, so dass ich das auch nicht testen kann.
Ach so, nochwas:
1. Ist es grundsätzlich vorzuziehen eine DLL implizit oder explizit zu laden?
2. Beim impliziten laden wird zuerst im Programmverzeichnis gesucht, und anschließend im System32-Dir (soweit ich weiß), kann man hier dem Programm noch nen Parameter oder so mitgeben, wo zusätzlich gesucht werden soll? Evtl. beim Linken?
-
Bei Linux heißt das Shared Object, haben die Endung .so.
-
THX, ist aber im Prinzip das Gleiche und wird auch gleich gehandhabt, bzgl. des Ladens, etc., oder gibt es da Unterschiede?
-
Das Prinzip ist das Gleiche, aber um diese Libraries benutzen zu können muss man die Betriebssystemfunktionen aufrufen. Das ist kein Teil von C++.
Unter Windows: LoadLibrary, GetProcAddress, FreeLibrary
Unter Linux: dlopen, dlsym, dlclose
-
Alles klar, vielen Dank!
-
Also die DLL krieg ich hin aber das Programm was dies benutzen soll will nicht compilliert werden.
Ich weiß jetzt nicht weiter hier der quellcode:
#include <windows.h> void DllFunction1(LPSTR message); /* Sollte in einer *.h Datei stehen */ int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow) { DllFunction1("Hello World 1!"); return 0; }Fehlermeldung:
| [Linker error]undefined reference to 'DllFunction1'
| Id returned 1 exit status
C:\...\Makefile.win| [Build Error][Fragenprogramm.exe]Error 1Kann mir jemand helfen?
Ich hab schon die DLL in das verzeichniss vom Projekt.Hat nichts geändert.
-
Hast du die lib der DLL mitgelinkt?
-
Die Definition im Header alleine reicht nicht, das reicht nur für den Compiler, der beschwert sich ja auch nicht. Sieht so aus, als wenn Du 2 Möglichkeiten hast.
- Du erzeugt zusätzlich zu der DLL eine Statische Lib und linkst Dein Projekt mit dieser statischen Lib, dann brauchst Du Dich nicht um das Laden der DLL kümmern, dann muss die DLL entweder im gleichen Verzeichnis liegen, wie die exe, oder im Windows-, oder System32-Verzeichnis, oder
- Du kümmerst Dich selbst darum, dass die DLL geladen wird, musst dann aber explizit jede Funktion laden.
typedef void (*fnptr)(LPSTR); int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow) { HMODULE myLib = NULL; fnptr myfn = NULL; myLib = LoadLibrary("mydll.dll"); if (myLib == NULL) MessageBox (NULL, "Fehler beim Laden der DLL", "Error", MB_OK); else { myfn = (fnptr)GetProcAddress(myLib, "name_of_function"); if (myfn == NULL) MessageBox (NULL, "Fehler beim Laden der Funktion", "Error", MB_OK); else { (*myfn)("Hello World!"); } } FreeLibrary (myLib); return 0; }ACHTUNG: ungetestet !!!
Ich habe bisher noch nicht viel mit DLLs gemacht, aber bisher immer die erste Variante genommen und bisher lief das top.
-
könntest du mir ungefähr einen Beispiel Quellcode für Variante 1(statische lib) schreiben?
Ich weiß jetzt wie ich eine DLL schreibe und Programm nur die statische kenn ich nicht.
mfg.
Stefan
-
Da gibt es nichts zu schreiben, Du bindest die Header von der dll in dein Projekt mit ein und gibst in deinem Projekteinstellungen mit an, dass er die statische Lib mitlinken soll.
Einige IDEs erzeugen die statische Lib automatisch, wenn sie die dll erstellen, bei einigen musst Du das extra mit angeben. Bei meiner IDE (Codeblocks) gibt es in den Projekteinstellungen eine Checkbox, wo man angeben kann, ob diese mit generiert werden soll.
Wenn Du die statische Lib mitlinkst, dann müsstest Du ohne Probleme kompilieren können. Beim Starten der exe gibt es aber eine Fehlermeldung, wenn sich die dll nicht in dem gleichen Verzeichnis befindent, wie die exe selbst.
-
Das Problem schein gelöst.Nächstes Problem
Fehler:
[Build Error]No rule to make target 'ang.o',needed by 'Fragenprogramm.exe'. Stop.Was heißt das jetzt,hab die DLL hab das Programm,sie linken aber es kommt ein Fehler.Warum?

mfg.
Stefan
-
Was ist ang.o? Soll das das Ergebnis der DLL werden? Des Programms? Welche IDE benützt du?
MfG SideWinder
-
Eigentlich wollte ich jetzt die dll mit dem Programm zusammen machen.
Ich nutze Dev-cpp.Was ang.o ist weiß ich nicht.
-
Stefan311 schrieb:
.Was ang.o ist weiß ich nicht.
ist die kompilierte ausgabe deiner quelldatei. wenn du nichts verstellt hast müsste noch zusätzlich eine *.a rauskommen das ist deine bibilothek die du mitlinken musst. mittels -ldeinelib
um evtl deine dll mit anderen compilern nutzen zu können kannst auch
noch--output-lib deinelib.libbeim linker mit angeben.
-
Es existiert nur ein ang1.o dann existiert noch libang.a,libang.def und Makefile.win.
Also libang.a muss ich mit verlinken.Aber wozu ist libang.def und Makefile.win?
-
Stefan311 schrieb:
Aber wozu ist libang.def
schau sie doch mal mit einem editor.
steht zb: die exporttabelle drinStefan311 schrieb:
und Makefile.win?
mingw braucht einige regeln um dein projekt zu kompilieren diese stehen hier drin.
doku zu deinem compiler
http://www.mingw.org/docs.shtml