# Frage zur Verwendung von DLLs



## Crymes (3. März 2012)

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?


----------



## fadade (3. März 2012)

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


----------



## Crymes (3. März 2012)

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 ?


----------



## fadade (3. März 2012)

jep ist möglich, nur sollte man dann mit Datentypen und Kompatibilität aufpassen!


----------



## Crymes (3. März 2012)

Müsste man dann das Open CL in der DLL initialisieren oder (vermute ich) in dem Hauptprogramm?


----------



## hardware_fanatiker (3. März 2012)

Das ganze gibt auch mit Java, falls relevant, nennt sich JNI.


----------



## Skysnake (3. März 2012)

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.


----------



## Crymes (3. März 2012)

Ok, Danke.
Das wird dann wohl eher verwendet, wenn mehrere Entwickler zusammen gleichzeitig an einem Projekt arbeiten?


----------



## bingo88 (3. März 2012)

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.).


----------



## Crymes (3. März 2012)

AAH, jetzt verstehe ich, warum es bei DirectX so viele davon gibt


----------



## Skysnake (3. März 2012)

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.


----------



## Crymes (6. März 2012)

andere sprache, ist es eigentlich möglich (wenn ja wie) ein Programm in verschiedenen Sprachen zu schreiben?


----------



## bingo88 (6. März 2012)

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#:

```
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).


----------



## Crymes (6. März 2012)

Danke, hoffe mal dass ich das nich brauchen werde


----------



## hardware_fanatiker (6. März 2012)

Jop, ich hatte wie gesagt die ehre, mit JNI zu arbeiten, und glaube mir, das ist kein Spass


----------



## Skysnake (8. März 2012)

bingo88 schrieb:


> 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#:
> 
> ...


 
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.


----------



## bingo88 (8. März 2012)

Ja gut, dass kenne ich auch von anderen Skriptsprachen. Aber an Skriptsprachen hatte ich da auch nicht gedacht ^^


----------



## Skysnake (8. März 2012)

Du kannst damit dann aber auch wieder andere Sprachen einbinden


----------



## bingo88 (8. März 2012)

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.


----------



## neo3 (13. März 2012)

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.


----------



## Crymes (13. März 2012)

Welche .NET Sprache ist deiener Meinung nach am sinnvollsten (of topic)?


----------



## neo3 (13. März 2012)

Na ja - das kann man so pauschal sicher nicht sagen. 
Für mich war C# immer etwas angenehmer, weil ich einfach die Notationen strukturierter finde. Ich komme aber auch von Java und habe früher mit PHP angefangen - da fühlt man sich mit 


```
if(a == b){}
```

einfach wohler als mit 


```
if a = b then 
... 
end if
```



Allerdings habe ich auch über eineinhalb Jahre in VB.Net gearbeitet und kam damit gut klar. 
Das sind halt persönliche Vorlieben, die eigentlich kaum etwas mit den Funktionen zu tun haben... Einige Unterschiede gibt es ja, ich hatte dazu auch mal einen interessanten Artikel gefunden, in dem die aufgelistet waren. Den kann ich Dir später raussuchen, wenn es Dich interessiert?

In jedem Fall sollte man sich vorher überlegen, ob man bestimmte Dinge, wie beispielsweise bestimmte Arten von Listen o.ä. braucht und sich anschauen, wie man diese mit der gewählten Sprache umsetzen kann.


----------



## Crymes (13. März 2012)

Das Problem ist, dass ich mit C++ etwas in Konsole Geschrieben hab und das jetzt mit Interface umsetzen will, aber kaum was mit C++ und .Net find


----------



## neo3 (13. März 2012)

Damit kenne ich mich leider auch nicht aus, da ich noch nichts in C++ geschrieben habe...

Mit welcher IDE arbeitest Du denn? ist das GUI komplex oder nur ne einfache Oberfläche? 
Ich denke, dass Du ein bisschen was über dein Projekt erzählen müsstest, damit Dir jemand dabei helfen kann


----------



## fadade (13. März 2012)

Also wenn du mit C# und WinForms arbieten kannst, dann läuft das in C++ .NET etwa genauso ab. Sprich wie im anderen Thread wäre es etwa folgendermaßen:


```
MessageBox.Show("Fehler");   // C#
MessageBox::Show("Fehler); // C++

System.Convert.ToInt32(..) //C#
System::Convert::ToInt32(..) //C++

TextBox tb1 = new TextBox(); //C#
TextBox ^tb1 = new TextBox(); //C++
```

Weiß nicht, ob es jetzt genauso stimmt, aber im Prinzip sind die ganzen Member/Methoden etc. gleich benannt, da eben im Framework enthalten. 
Mit Visual Studio (Express weiß ich nicht) kann man unter "Neues Projekt" dann bei "C++" aber auch irgendwie WindowsForms-Application auswählen und dann wie oben ähnlich zu C# eine GUI programmieren

Aber immer noch der Tipp, versuch GUI lieber mit native C++ und QT oder so anstatt C++ .NET + WinForms umzusetzen!
Oder nutz gleich C#


----------



## Skysnake (13. März 2012)

nimm QT, dann haste was gescheites, und wenn du das kannst freut das viele Leute


----------

