Frage zur Verwendung von DLLs

  • Ersteller Ersteller Crymes
  • Erstellt am Erstellt am
C

Crymes

Guest
Hallo,
Dlls sind ja (glaube ich) ausgelagerte Programmteile.
Wenn ich mir jetzt ein Programm schreib, dass 2 Zahlen addiert, könnte ich mir eine Funktion in eine DLL schreiben, die die Zahlen addiert und die DLL dann per funktionsaufruf in mein Hauptprogramm einbinden, wo die Zahlen aufgenommen und ausgegeben werden?

Oder habe ich was falsch verstanden und das funktioniert ganz anders?
 
jep, so is das Prinzip, grob gesagt.
Wie die DLLs verwendet werden hängt dann auch noch ein bisschen von der Programmiersprache ab.

Für kleine Projekte lohnt sich das nur meistens nicht ;)
 
Können Dlls auch in anderen Sprachen sein?
Z.B. Die Ein- und ausgabe im Hauptprogramm per C++ und irgendein Algorythmus per Dll in Open cL ?
 
Müsste man dann das Open CL in der DLL initialisieren oder (vermute ich) in dem Hauptprogramm?
 
dll steht ja nur für dynamic link libary

Das hängt mit dem Link prozess beim compilieren zusammen. Du linkst halt nicht auf eine feste datei, die du mit auslieferst, sondern verwendest z.b. Bibliotheken von Windows, gegen die du linkst.

Für ein einzelnes Programm macht das keinen Sinn. Vor allem musst DU! Halt sicherstellen, das die Bibliotheken auf dem Zielrechner auch da sind wo Sie sein sollen.

Du solltest also statisch linken. Das macht am wenigste. Probleme, und dein Programm wird sicherlich auch nicht zu komplex dafür sein.
 
Ok, Danke.
Das wird dann wohl eher verwendet, wenn mehrere Entwickler zusammen gleichzeitig an einem Projekt arbeiten?
 
Nein, das hat damit nichts zu tun. Die Grundidee hinter einer DLL ist, von mehreren Programmen gemeinsam genutzte Funktionalität nur einmal bereitzustellen. Also anstatt die Funktionen mit jedem Programm statisch zu linken (Funktionen werden in das Programm integriert) werden sie beim Starten des Programms aus der DLL geladen (sind also nicht im Programm selbst enthalten). Soweit die Theorie. In der Praxis hat das besonders unter Windows in der Vergangenheit immer wieder zu Problemen geführt ("DLL-Hölle"), da du natürlich die für dein Programm korrekte Version der DLL benötigst - mit einer anderen Version sind ggf. Funktionen nicht mehr enthalten oder der interne Aufbau stimmt nicht mehr (Funktionsadressen etc.).
 
wie bingo88 schongesagt hat, macht es halt nur teilweise sinn DLLs zu verweneen.

Gerade bei GUI macht es sinn etc. Ansonsten wird es halt schwierig, wegen den genannten Problemen. Man macht das halt, um das Programm kleiner zu machen, und eben nicht alles selbst warten zu müssen. Das macht aber echt nur bei großen Projekten meiner Meinung nach Sinn, ansonsten handelt man sich mehr Stress und Probleme ein, als das es wert ist.
 
andere sprache, ist es eigentlich möglich (wenn ja wie) ein Programm in verschiedenen Sprachen zu schreiben?
 
Das geht eigentlich nur indirekt. Du kannst bspw. mit C# auf C/C++ Libraries (DLLs) zugreifen. Wie du das konkret machst, hängt aber von der jeweiligen Sprache ab (da du dafür bestimmte Konstrukte benötigst). Von native-Code nach native-Code ist in der Regel kein Problem, ebenso wie Skript-/Manged-Code (C#, Java) nach native-Code. Umgekehrt kann es allerdings recht schnell ziemlich hässlich werden (bspw. C++ nach Java).

Ein Beispiel für C#:
Code:
using Sytem;
using System.Runtime.InteropServices;

class Test
{
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // ruft die MessageBox aus der WinAPI auf (genauer: MessageBoxW wegen unicode)
        MessageBox(new IntPtr(0), "Hello, World!", "Test", 0);
    }
}
Ein Programm komplett in verschiedenen Sprachen geht glaube ich nur bei .NET. Ich habe das selbst noch nicht gemacht, aber schon mehrfach gelesen. Beispielsweise kannst du einfach eine VB .NET Codedatei in ein C# Projekt einbinden (es wird halt der gleiche Byte-Code erzeugt).
 
Zuletzt bearbeitet:
Das geht eigentlich nur indirekt. Du kannst bspw. mit C# auf C/C++ Libraries (DLLs) zugreifen. Wie du das konkret machst, hängt aber von der jeweiligen Sprache ab (da du dafür bestimmte Konstrukte benötigst). Von native-Code nach native-Code ist in der Regel kein Problem, ebenso wie Skript-/Manged-Code (C#, Java) nach native-Code. Umgekehrt kann es allerdings recht schnell ziemlich hässlich werden (bspw. C++ nach Java).

Ein Beispiel für C#:
Code:
using Sytem;
using System.Runtime.InteropServices;

class Test
{
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // ruft die MessageBox aus der WinAPI auf (genauer: MessageBoxW wegen unicode)
        MessageBox(new IntPtr(0), "Hello, World!", "Test", 0);
    }
}
Ein Programm komplett in verschiedenen Sprachen geht glaube ich nur bei .NET. Ich habe das selbst noch nicht gemacht, aber schon mehrfach gelesen. Beispielsweise kannst du einfach eine VB .NET Codedatei in ein C# Projekt einbinden (es wird halt der gleiche Byte-Code erzeugt).

Doch das geht auch mit C/C++ "ohne" Probleme. Ich arbeite z.B. an einem Programm, welches in C++ und Perl geschrieben ist. Da greifen die Perf/C++ Teile natlos ineinander, man muss halt nur die Sprachteile in unterschiedlichen Files trennen und für Perl einen Parser verwenden.

Ist ganz nett zu verwenden, da man einiges im Programm ändern kann, ohne dieses neu compilieren zu müssen, da Perl ja erst zur Laufzeit übersetzt wird, bzw. geschaut wird, ob die aktuelle übersetzung aktuell ist, oder nicht. Ich empfehle so etwas aber nur in geringem Umfang für kleinere Projekte. Der Overhead alles zum laufen zu bekommen ist schon sehr groß. Das ist kein Zuckerschlecken.

Man sollte erst mal die einzelnen Sprachen RICHTIG! beherrschen, bevor man sich über so etwas gedanken macht.
 
Ja gut, dass kenne ich auch von anderen Skriptsprachen. Aber an Skriptsprachen hatte ich da auch nicht gedacht ^^
 
Ich hatte die Frage jetzt halt so verstanden, dass man Sourcefiles in verschiedenen Sprachen durch einen Compiler jagt und am Ende ein Programm raus kommt.
 
Also ich habe ein mittelgroßes Projekt mit einem anderen zusammengeführt, da mein Chef meinte, es wäre sinnvoll, alle Funktionalitäten unter einem GUI und eben in einem Projekt zu vereinen.
Das eine Porjekt lag in VB.Net, das andere in C# vor. Geklappt hat das Zusammenführen problemlos, da ich die beiden Projekte importiere und beides in ja .Net vorliegt. Der Aufwand betrug nur wenige Stunden.

Bei grob unterschiedlichen Sprachen und kleineren Projekten ist das ganze natürlich weniger sinnvoll und wie erwähnt wahrscheinlich auch meistens aufwändiger, als einen Teil neu zu schreiben. Ich denke, dass der Umfang einer Programmiersprache in den wenigsten Fällen limitieren sollte. Kann aber natürlich auch vorkommmen, dass es aufgrund der zur Verfügung stehenden Funktionen nötig ist... allerdings sind DLLs in solchen Fällen auch ganz hilfreich!

Ein Nachtrag noch zu den DLLs: Ich habe viel mit der CGAL-Bib gearbeitet, die man als DLL importiert. Wenn alles, was ich quasi "in die DLL rein schicke" fehlerfrei ist, läuft auch alles super. Nur wenn etwas nicht funktioniert und man ans Debuggen muss, ist dies mit der DLL doch ziemlich nervig... Daher würde ich DLLs auch wirklich nur dann nutzen, wenn es unbedingt sein muss.
 
Zurück