PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DLL`s ?


Einfachkrank
2003-04-20, 16:10:26
Hi,

ich muss mal ganz blöd dazu fragen: Was macht man mit DLL´s, worin liegt der Vorteil, wie funktionieren sie und wo kann man sie anwenden? Würde mich einfach mal komplett dazu interessieren :)

MFG Einfachkrank

Demirug
2003-04-20, 16:55:57
Eine DLL ist in erster Linie eine Datei welche den ausfürbaren Code für einen oder mehrer Funktionen enthält. Für sich aleine ist eine DLL aber nicht lauffähig weil sie keine Hauptfunktion hat.

Die Anwednungsgebiete sind vielfältig:

- Benutzten der gleichen Funktionen in mehr als einer Anwednung
- Plugin Techniken
- Compilerübergreifendes programmieren. z.b. Funktionen mit C++ erstellen und aus VB benutzten
- Funktionalität an dritte geben (verkaufen) ohne des Sourcecode herauszugeben

Die Vorteile ergeben sich immer aus dem Anwednungsgebiet.

Die Funktionsweise ist eigentlich ganz einfach. Die DLL stellt eine Liste mit Funktionen zur Verfügung und die Anwendung (oder eine andere DLL) bindet aufgrund einer eigenen Liste diese Funktionen beim laden oder zur Laufzeit ein. Der Rest sind dann sehr Technische Details in den tiefen des Betriebssystems.

Einfachkrank
2003-04-21, 01:58:43
Aha! Kann ich also einfach im Visual C/C++ Compiler ein DLL-Projekt anfangen, meine Funktionen in dieses programmieren und dann die fertig erstellten DLL´s in anderen Programmen weiterverwenden? Oder ist das doch noch ein wenig komplizierter?
Und wenn es so ist, wie binde ich diese DLL´s dann in meine Programme ein?

Xmas
2003-04-21, 02:22:19
Originally posted by Einfachkrank
Aha! Kann ich also einfach im Visual C/C++ Compiler ein DLL-Projekt anfangen, meine Funktionen in dieses programmieren und dann die fertig erstellten DLL´s in anderen Programmen weiterverwenden? Oder ist das doch noch ein wenig komplizierter?
Theoretisch ist es so einfach. Praktisch gibt es noch ein paar Tücken á la __declspec(dllexport) und die Möglichkeit eine DllMain zu schreiben, die beim Laden der DLL automatisch gestartet wird.
Aber das siehst du am besten, wenn du mit dem VC-Assistenten ein DLL-Projekt erstellst.

Und wenn es so ist, wie binde ich diese DLL´s dann in meine Programme ein?
Zu der DLL wird noch eine LIB erzeugt, die statisch mit dem Programm verlinkt wird. Diese sorgt dafür dass die DLL beim Programmstart geladen wird und die Funktionsadressen daraus geholt werden.

Es ist auch möglich, mit einer WinAPI-Funktion die Adresse von einzelnen Funktionen anhand ihres Namens aus einer DLL zu holen (die DLL wird dann bei Bedarf in den Speicher geladen)

Dazu brauchst du die Header-Datei die du beim Erstellen der DLL verwendet hast (oder etwas ähnliches in einer anderen Programmiersprache), damit die Funktionen und Variablen aus der DLL auch dem Compiler bekannt sind.

stabilo_boss13
2003-04-21, 09:48:34
Hier gibt es übrigens eine Freeware, um die Funktionen zu sehen, die eine Dll exportiert:
http://www.simtel.net/pub/pd/55053.html

Einfachkrank
2003-04-21, 16:40:16
Wie muss das im Gesamten denn jetzt aufgebaut werden, wenn ich nur Funktionen in die DLL´s unterbringen will, also keine MainDLL? Gibt´s da ein kleines Tutorial dazu? :)

Xmas
2003-04-21, 17:11:53
Originally posted by Einfachkrank
Wie muss das im Gesamten denn jetzt aufgebaut werden, wenn ich nur Funktionen in die DLL´s unterbringen will, also keine MainDLL? Gibt´s da ein kleines Tutorial dazu? :)
Das schreiben der DLL ist wirklich nicht schwer. Wenn du keine DllMain verwenden willst, lass sie einfach weg.

Ansonsten muss nur jedes Symbol (Variable, Konstante, Funktion, Klasse) das du exportieren willst (also von außen nutzbar sein soll), beim Compilieren der DLL mit __declspec(dllexport) deklariert sein.

Das kompliziertere kommt erst bei der Verwendung der DLL, je nachdem mit welcher Sprache du das Programm schreibst das die DLL nutzen soll, und wenn du z.B. dynamisches Austauschen der DLL während der Programmausführung zulassen willst.

stabilo_boss13
2003-04-21, 17:13:16
Tutorials:
http://www.gamecoding.org.uk/tutorials/showarticle.php?article=2002/feb/memdll
http://www.cpp-home.com/tutorial.php?32_1
http://www.flipcode.com/tutorials/tut_dll01.shtml

Einfachkrank
2003-04-21, 17:58:04
Hey cool! Eine klein DLL-Datei zu erstellen und sie zu verwenden ist wirklich einfach :)
Kann ich das ganze jetzt auch mit einer Klasse machen, also dass ich eine in einer Headerdatei deklariere und in einer Quellcodedatei deren Funktionen schreibe... und später ich dann die Headerdatei einbinde und eine Klasse von diesem Typ anlege und mit deren Funktionen arbeite?
Was ändert sich dabei dann? :)

Demirug
2003-04-21, 18:12:42
Im Prinzip geht das auch mit Klassen, allerdings gibt es da einen Problem. Sobald man C++ Klassen oder Funktionen aus einer DLL exportiert ist nur noch sichergestellt das man diese DLL mit Programmen welche mit dem gleichen Compiler (teilweise sogar gleiche Version) erstellt werden benutzten kann.

Falls du es aber trotzdem noch tun möchtest __declspec(dllexport) und __declspec(dllimport) läst sich auch mit Klassen anwenden. Das muss dann wie folgt aussehen


class __declspec(dllexport) X
{
....
};



class __declspec(dllimport) X
{
....
};


da ausser dem __declspec(dllexport) und __declspec(dllimport) alles gleich ist handelt es sich um eine der wenige Dinge wo man den Preprozor sinnvoll nutzen kann.

Einfachkrank
2003-04-21, 18:40:49
was machtn dllimport im Gegensatz zu dllexport, ich kenne nur das export...
Und muss ich das __declspec(dllexport) nur vor der Klasse anwenden und sonst nirgends oder auch vor den Funktionen ?

Demirug
2003-04-21, 18:45:49
Originally posted by Einfachkrank
was machtn dllimport im Gegensatz zu dllexport, ich kenne nur das export...
Und muss ich das __declspec(dllexport) nur vor der Klasse anwenden und sonst nirgends oder auch vor den Funktionen ?

das dllimport brauchst du um dem Compiler zu sagen das die Klasse sich in einer DLL befindet. Also wenn du den Header zu erzeugen der DLL benutzt wird dllexport will man die Klasse dann aber in einer Applikation benutzten muss im Header dllimport stehen.

ja, bei der Klasse reicht vollkommen.

PS: habe ich schon erwähnt das ich diese ganze DLL import export sache hasse? /me nimmt nur noch COM oder besser gleich .Net.

Einfachkrank
2003-04-21, 18:58:44
Oh je, also muss ich beim Erstellen der DLL in der Header dllexport angeben und wenn ich sie verwenden will, dann in einer anderen Header das dllimport ? ???

Demirug
2003-04-21, 19:05:36
Originally posted by Einfachkrank
Oh je, also muss ich beim Erstellen der DLL in der Header dllexport angeben und wenn ich sie verwenden will, dann in einer anderen Header das dllimport ? ???

Ja und deswegen macht man das gerne mit entsprechenden Preprozessor Anweisungen.


#ifdef A_IMPL
#define CLASS_DECL_A __declspec(dllexport)
#else
#define CLASS_DECL_A __declspec(dllimport)
#endif

class CLASS_DECL_A X
{
....
}


Bei erzeugen der DLL hängt man dann ein A_IMPL bei den Preprozessor Defines dazu.

So kommt man dann mit nur einem Headerfile aus.

Einfachkrank
2003-04-21, 19:18:54
ach, mann muss dann auch noch die komplette Klasse noch mal deklarieren oder kann man das umgehen ?

Demirug
2003-04-21, 19:20:56
Originally posted by Einfachkrank
ach, mann muss dann auch noch die komplette Klasse noch mal deklarieren oder kann man das umgehen ?

nein muss man nicht wenn man es so macht wie ich im vorhergehende Post schon geschrieben habe.

Einfachkrank
2003-04-21, 19:27:08
Achsoooo! Das is very cool :) Danke, ich werds gleich probieren :)

Xmas
2003-04-21, 20:26:42
...übrigens ein Grund warum ich zum VC-Assistenten geraten habe. Der macht das automatisch ;)

Einfachkrank
2003-04-22, 15:35:08
Gut, vom Erstellen funktioniert alles perfekt, nur beim Verwenden...
Wenn ich meine DLL-Datei mit eingebauter Klasse verwenden will, fragt mich gleich Windows, ob ich einen Problembericht an Microsoft senden möchte ;)
Da ich viele Funktionen einfach nur kopiert habe, aus vorher erstellten Klassen, kanns am Quellcode nicht liegen, aber ich vermute noch, dass die Funktionen der Klassen oder die Klasse selbst nicht richtig exportiert werden. Denn als ich das erste Mal meinen Code im DLL-Projekt comiled habe, hatte er mir für jede Klassenfunktion einen Warning angezeigt, der was von möglicher nicht Verbindung zur DLL angab... Eigentlich wollte ich diesen Fehler kopieren und hier posten, aber seit ich noch mal auf comilen gedrückt habe, zeigt er mir 0 Warnings an, sind quasi einfach verschwunden ???

Muss ich vielleicht doch noch was hinzufügen oder habt ihr eine andere Vermutung ?

Einfachkrank
2003-04-22, 16:19:47
Ok, sorry, das Problem hat sich soeben auch erledigt, aber hab trotzdem noch ein anderes... :D :D :D
Und zwar, wenn ich die fertig erstellte DLL-Datei, die Header Datei, die *.lib Datei und diese *.exp Datei zusammen in einen Ordner packe und dann im Visual C++ Compiler angebe, wo er nach Libary Files und Header Files suchen soll, bekomme ich später angezeigt, dass die DLL Datei nicht gefunden wurde... Wo muss ich denn das noch einstellen, damit das funktioniert, ohne dass ich die Dateien jedes Mal lokal in den Projektordner schieben muss :)

Xmas
2003-04-22, 18:31:59
Originally posted by Einfachkrank
Ok, sorry, das Problem hat sich soeben auch erledigt, aber hab trotzdem noch ein anderes... :D :D :D
Und zwar, wenn ich die fertig erstellte DLL-Datei, die Header Datei, die *.lib Datei und diese *.exp Datei zusammen in einen Ordner packe und dann im Visual C++ Compiler angebe, wo er nach Libary Files und Header Files suchen soll, bekomme ich später angezeigt, dass die DLL Datei nicht gefunden wurde... Wo muss ich denn das noch einstellen, damit das funktioniert, ohne dass ich die Dateien jedes Mal lokal in den Projektordner schieben muss :)
Um mal aus dem ersten von stabilo_boss13 gelinkten Tutorial zu zitieren:

When a link library is loaded by an application, Windows will look for the DLL using the following order:

The current directory.
The windows primary directory.
The windows system directory.
The directory where the client resides.
The directories listed in the "path" environment variable, in order.
Mapped network directories.

Das Laden der DLL zur Laufzeit hat mit Visual C++ gar nichts mehr zu tun.

edit: Und die DLL solltest du auf jeden Fall in den Projektordner (bzw. in die Ausgabeordner Release und Debug) kopieren. Denn so vergisst du nicht, die (notwendige) DLL weiterzugeben, wenn du die Anwendung weitergeben willst.

Einfachkrank
2003-04-22, 21:36:40
Hi,

also dass mir der DLL hab ich jetzt anders gelöst, wie folgt:
Hab mit Nitro Setup 1.4 (wer´s kennt) ein Setup für die DLL,Lib,Exp und Header Datei erstellt, die die DLL in den Windows System Ordner kopiert und die restlichen Dateien wie en DXSDK installiert... Den Ordner hab ich dann einfach wie DXSDK gelinkt und siehe da es funzt :) *freu* ;)

Hab aber jetzt doch noch mal den Warning kopieren können, weils mich spontan doch noch interessiert:
d:\save\windows\visual c++\m3ddll\m3ddll.cpp(101) : warning C4273: 'CreateGLWindow' : inconsistent dll linkage. dllexport assumed.
Muss ich diesem Warning große Beachtung schenken, weil jetzt doch alles funktioniert ?

MFG Einfachkrank