AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu DLL

Ein Thema von Luki206 · begonnen am 29. Nov 2013 · letzter Beitrag vom 1. Dez 2013
Antwort Antwort
Seite 1 von 2  1 2      
Luki206
(Gast)

n/a Beiträge
 
#1

Frage zu DLL

  Alt 29. Nov 2013, 15:33
Hi,
ich habe eine kleine Frage über das Benutzen von DLL. Da ich, in den Tutorials die ich gelesen hatte, nur das einbinden einer function gesehen hatte ist jetzt meine Frage, was man mit den DLL genau noch machen kann? Weil ich hatte ein etwas älteres Programm von mir gefunden und habe jetzt vor es 'aufzuräumen'. Kann man auch in DLL ganze proceduren reinstellen die dann im Programm ausgeführt werden? Also ich meine so eine Art von proceduren die bei z.B. Labels die Caption ändern?
Danke
Luki
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Frage zu DLL

  Alt 29. Nov 2013, 16:08
Ja!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Frage zu DLL

  Alt 29. Nov 2013, 16:32
Zitat:
Caption = String
Aber wenn du gewisse Dinge über die DLL-Grenzen hinweg gibst und diese auch nopch über Laufzeit der Funktion weiterbenutzt, dann mußt du den Arbeitsspeicher der DLL und der EXE verbinden.
> SharedMemory
Denn grundsätzlich nutzen erstmal beide Teile ihren eigenen Speichermanager und da String LongStrings vom Speichemanager verwaltet werden, knallt es, wenn plötzlich der falsche Speichermanager sich um den fremden Speicher kümmern soll.
> Strings, dynamische Arrays usw.

ShortString und teilweise auch PChars lassen sich dagegen problemlos übergeben.


Und wenn auch noch etwas die RTTI betreffend (z.B. Objekte) übergeben werden, dann wird es ganz lustig, da man dann auch noch die beiden RTTIs verbinden muß.
> Packages
$2B or not $2B
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#4

AW: Frage zu DLL

  Alt 29. Nov 2013, 16:42
Ok danke für eure Antworten
@himitsu: Ich hoffe mein Rechner explodiert dann nicht.. Oder war das einfach so eine Metapher für, das sich dann irgendetwas verabschiedet?

Edit: Wäre es eigentlich auch möglich gleich den ganzen 'Block' also Label1.Caption := ('Hallo') in eine DLL zu setzten?

Geändert von Luki206 (29. Nov 2013 um 17:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Frage zu DLL

  Alt 29. Nov 2013, 18:54
Der Speichermanager wirft mit Exceptions um sich, wenn er einen falschen Zeiger, der nicht ihm gehört, zum Freigeben bekommt, oder für's Ändern der Größe.

Und wenn das Programm auf einen "falschen" Typ trüft, der nicht zu seiner Umgebung gehört, dann können Adressen und gemeinsam genutzte Objekte ein schönes Chaos ergeben, was dann auch in netten Exceptions oder in netten fehlerhaften Speicherzugriffen (Buffer Overun und Co.) enden, was dann sofort oder erst später knallt, wenn der entsprechende zerschossene Speicher dann benutzt wird.

Delphi-Quellcode:
type
  TMyClass = class
    FeldA: Integer; // liegt im Speicher am Offset +A
    FeldB: Integer; // liegt im Speicher am Offset +B
    procedure MachWasX; virtual; // Adresse liegt in der RTTI am Offset +X
    procedure MachWasZ; virtual; // Adresse liegt in der RTTI am Offset +Y
  end;
Im Prinzip kann Delphi nichtbenutztes entfernen und das wird dann garnicht erst einkompilert. (auch wenn das dank der neuen RTTI nicht immer so ist ... ratet mal, warum die EXEn immer größer werden ... weil auch potentiell ungenutztes einkompiliert wird .... könnte ja sein, daß man via RTTI drauf zugreift, aber da wäre es schöner, wenn mich Delphi vorher gefragt hätte und ich ihm explizit sage, was unbedingt mit rein muß, auch wenn keine Benutzung erkannt wird)

Die EXE greift nur auf FeldB und MachWasZ zu ... der Compiler/Linker läßt FeldA und MachWasX einfach weg.
Die DLL haz zufällig alles benutzt und jetzt steht aber in der EXE das EXE.FeldB an der Speicherstelle von DLL.FeldA, sowie MachWasZ steht abeim Offset X,
womit dann die DLL auf die falschen Speicherbereiche/Adressen zugreift, wenn sie auf eine Objektinstanz zugreift, die von der EXE erstellt wurde. Und andersrum genauso.

Edit: Wäre es eigentlich auch möglich gleich den ganzen 'Block' also Label1.Caption := ('Hallo') in eine DLL zu setzten?
Ja, aber nur wenn man ddie Zugehörigkeiten beachtet.
$2B or not $2B

Geändert von himitsu (29. Nov 2013 um 19:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Frage zu DLL

  Alt 29. Nov 2013, 19:28
Edit: Wäre es eigentlich auch möglich gleich den ganzen 'Block' also Label1.Caption := ('Hallo') in eine DLL zu setzten?
Man kann. Man muss sich dazu aber auf den Kopf stellen (sinnbildlich).

Als Tipp: Mach es nicht! Es ist nicht der Sinn solche Sachen nach außen zu verlagern. Wenn Du ein Fenster hast, dann lass es bitte in einem Programm und ändere es nur dort. Was für einen Sinn hat es denn, die Caption in der DLL zu ändern? Eigentlich keinen. Was du auslagern kannst, sind Berechnungen, Datenbanksachen. Die geben dann eine Zeichenkette zurück (achte bei der Übergabe darauf, was himi gesagt hat; aber versuche sharemem zu vermeiden) und fertig. Wenn du Grafiksachen auslagern willst z.B. als Plugin dann benutze ActiveX und stelle z.B. ein gesamtes Frame in der Bibliothek dar.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Frage zu DLL

  Alt 29. Nov 2013, 20:24
DLLs funktionieren auch wunderbar mit WideString ohne ShareMem
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Frage zu DLL

  Alt 29. Nov 2013, 20:39
DLLs funktionieren auch wunderbar mit WideString ohne ShareMem
ShortString geht auch Problemlos.
WideString läuft über den Speichermanager der ole32.dll oder oleauth.dll (vergess es immer), also über eine gemeinsame Ressource.

Wobei SharedMemory sich noch recht leicht einrichten lässt, da die Funktionalität direkt im FastMM verbaut ist ... man muß es nur aktivieren.


Aber Objekte über EXE-DLL-Grenzen gehen nicht (sicher),
es sei denn, man übergibt sie als Interface.
$2B or not $2B
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#9

AW: Frage zu DLL

  Alt 1. Dez 2013, 11:12
Danke für eure Antworten Ich werde das mit dem [Label1.Caption := ('Hallo') in meine Anwendung setzten und nicht in die DLL
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Frage zu DLL

  Alt 1. Dez 2013, 11:17
DLLs funktionieren auch wunderbar mit WideString ohne ShareMem
Wenn man nicht unbedingt andere Frameworks/IDEs als Delphi/VCL verwenden will würde ich WideStrings vermeiden wenn es bei der DLL-Schnittstelle auf 100% Performance ankommt.

Widestrings sind verglichen mit den UnicodeStrings von Delphi krottenlangsam.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz