DLL richtig verwenden?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: DLL richtig verwenden?

Beitrag von Macros »

Da drängt sich mir gerade die Frage auf:
Wie verwendet man eine DLL am saubersten?
In der PB Hilfe gibt ja gleich 3 Wege:
  • Callfunction (nicht sauber)
  • Import
  • Prototypes
Was sind die Vor und Nachteile?
Bei Prototypes schon mal, dass die Autovervollständigung nicht mitspielt.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: DLL richtig verwenden?

Beitrag von ts-soft »

Macros hat geschrieben:Da drängt sich mir gerade die Frage auf:
Wie verwendet man eine DLL am saubersten?
In der PB Hilfe gibt ja gleich 3 Wege:
  • Callfunction (nicht sauber)
  • Import
  • Prototypes
Was sind die Vor und Nachteile?
Bei Prototypes schon mal, dass die Autovervollständigung nicht mitspielt.
CallFunction fällt schon mal weg, das ist nicht Typensicher, der Compiler kann weder
die Anzahl der erforderlichen Parameter noch ihren Typ bestimmen!

Wenn eine DLL unbedingt für das Programm erforderlich ist, bietet es sich an den
Import zu nutzen. Dies entspricht einer frühen Bindung. Nachteil:
wird die DLL nicht gefunden, kann man den Fehler nicht auffangen, da er von
Windows behandelt wird (DLL fehlt, Neuinstallation sollte helfen oder so ähnlich).

Mit Polib (im PB-Compilers Verzeichnis) kann man sich recht einfach eine passende Lib
erzeugen, falls nicht vorhanden.

Mit OpenLibrary und Prototypes bietet sich an, wenn die DLL dynamisch, (späte Bindung)
geladen werden soll. Wenn eine DLL nicht unbedingt erforderlich ist, bzw. nur auf
bestimmten OS usw. bietet sich dies an. Das Programm kann selber auf nichtvorhandene
DLL reagieren. Sicherheitsrisiko ist größer da DLL Injection einfacher.

Importzeilen sind auch eine Art Prototype! Import ist die schnellste Möglichkeit.
OpenLibrary also nur nutzen, wenn man eines der Vorteile benötigt oder man es nicht
schafft, sich eine fehlende ImportLib zu erzeugen.

Gruß
Thomas
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: DLL richtig verwenden?

Beitrag von Macros »

Danke, das hat mir schon mal weiter geholfen, aber ein paar Fragen bleiben noch:
Was genau sind, und wie funktionieren ImportLibs ? Damit hab ich mich noch nicht beschäftigt
und auch die Hilfe schweigt sich aus.
Gerade bin ich unter Linux, dort gibt es eine pbsoimporter ausführbare Datei, ich nehme mal an, das ist das Gegenstück zu polib?
Sonst reicht mir auch eine Beschreibung für Windows, muss ich halt kurz wechseln.

Darf ich den Rest so zusammnefassen?
Wenn Sicherheit nicht wichtig ist, ist es kein Fehler standardmäßig auf Prototypes zu setzen,
da sie Import sehr ähneln, aber eine eigene Fehlerbehandlung ermöglichen.
Wenn ich eine definierte Umgebung habe, und auf Sicherheit achten muss, verwende ich Import.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: DLL richtig verwenden?

Beitrag von ts-soft »

Der pbsoimporter erzeugt importlibs, ähnlich den UserLibs, dies ist eine weitere
Möglichkeit, die man eher nicht nutzen sollte, hat ähnliche Nachteile wie CallFunction...
und Code ist ohne diese erzeuge Lib woanders nicht nutzbar.

Welches Tool Linux zur Erstellung von statischen Libs nutzt weiß ich gerade nicht,
aber Polib gibts dort nicht, entsprechendes Tools unter Linux ist aber vorhanden,
aber nicht im PB Compilers Dir.

Jetzt mal 3 ganz einfache Beispiele, die aber die Vorteile nicht unbedingt erkennen
lassen, da ich z.B. keine Pseudotypes verwende.

Code: Alles auswählen

; Beispiel 1, herkömmlich, nicht empfohlen
If OpenLibrary(0, "user32.dll")
  CallFunction(0, "MessageBoxA", 0, @"Text", @"Titel", #MB_OK)
  CloseLibrary(0)
EndIf

; Beispiel 2, mit Prototypes
Prototype MessageBox(hWnd, Text.s, Titel.s, Flag = #MB_OK)
If OpenLibrary(0, "user32.dll")
  MessageBox.MessageBox = GetFunction(0, "MessageBoxA")
  MessageBox(0, "Text", "Titel")
  CloseLibrary(0)
EndIf

; Beispiel 3, mit Import
Import "user32.lib"
  MessageBoxA(hWnd, Text.s, Titel.s, Flag = #MB_OK)
EndImport
MessageBoxA(0, "Text", "Titel")

Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: DLL richtig verwenden?

Beitrag von Rings »

@The_Dark_Zim:
geht es jetzt bei dir ?
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Re: DLL richtig verwenden?

Beitrag von Deluxe0321 »

Mal so nebenbei eingestreut:
Wenn ich nun Import verwende, wie kann ich die dll z.b in einem anderen Verzeichnis liegen lassen?
Also in dieser Art:
Ordner\Programm.exe <-- Programm
Ordner\dll\meinedll.dll <-- Dll für Import

Grüße
Ich habe keine Lösung, aber ich bewundere das Problem.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: DLL richtig verwenden?

Beitrag von ts-soft »

Deluxe0321 hat geschrieben:Mal so nebenbei eingestreut:
Wenn ich nun Import verwende, wie kann ich die dll z.b in einem anderen Verzeichnis liegen lassen?
Also in dieser Art:
Ordner\Programm.exe <-- Programm
Ordner\dll\meinedll.dll <-- Dll für Import

Grüße
DLL muß sich im Pfad (ProgramDir, Windows, System32 usw.) befinden!
Die einzige Möglichkeit wäre, den Pfad vor start des Programmes zu erweitern,
das sollte aber nicht so praktikabel sein :)
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Re: DLL richtig verwenden?

Beitrag von Deluxe0321 »

Danke für die Info.. naja.. dann weiter Prototype..
Grüße
Ich habe keine Lösung, aber ich bewundere das Problem.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: DLL richtig verwenden?

Beitrag von The_Dark_Zim-.- »

@ Rings
Danke schön :bounce:
Scheint soweit zu gehen, werde das nun in mein Programm einbinden und dann melde ich mich nochmal ;)
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: DLL richtig verwenden?

Beitrag von The_Dark_Zim-.- »

Ich hab hier ein kleines Problem ..
Ich soll einen String übertragen aber PB sagt : "Bad parameter type, number expexted instead of string." :bluescreen:
Wie soll ich nun einen String übermitteln ?
Hab CallFunction benutzt.

Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten