AGB  ·  Datenschutz  ·  Impressum  







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

DLL mehrfach im Programm verwenden

Ein Thema von moelski · begonnen am 19. Jan 2009 · letzter Beitrag vom 21. Jan 2009
Antwort Antwort
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

DLL mehrfach im Programm verwenden

  Alt 19. Jan 2009, 20:37
Moin !

Ich hät da mal gern ein Problem mit DLLs ... Und zwar nutzen wir MDI Fenster. In diesen Fenstern kommen Daten an und die werden über eine DLL ausgewertet. Nun kann man aber logischerweise mehrere MDI Fenster parallel halten und somit hat man auch mehrfach die DLL in Verwendung. Die DLL wird jeweils dynamisch in dem MDI Fenster per LoadLibrary eingebunden.

So bis hierher alles tutti - das funktioniert. Nun habe ich mich erdreistet in der DLL eine globale Variable zu definieren:
var LastTime : TDateTime; Diese Zeit wird verwendet um die Zeitdifferenz zwischen zwei Dateneingängen zu überprüfen.

Wenn ich nun aber 2 MDI Fenster auf die gleiche DLL los schicke, dann scheinen diese globalen Variablen von beiden MDI Fenstern genutzt zu werden, denn die Zeitdifferenzen passen aufmal überhaupt nimmer ... Auch ein Logging hat das bestätigt.

Nun ist es sicherlich schon mal falsch (so vermute ich mal) in der DLL globale Variblen zu "halten", oder? Das Problem ist allerdings, dass dort verschiedene DLLs zur Auswertung herangezogen werden können. Und jede DLL braucht so ihre eigenen Merker zur Auswertung. Wie mache ich dass denn nun?

Ich hatte ja eigentlich gedacht / gehofft das durch die Erstellung eines neuen MDI Fensters und die damit verbundene dynamische Neuverlinkung der DLL quasi eine neue Instanz der DLL erzeugt wird. Aber dem ist wohl nicht so ?!
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#2

Re: DLL mehrfach im Programm verwenden

  Alt 19. Jan 2009, 20:55
Moin !

Auweia ... Eigentor geschossen, es sind wirklich die globalen Variablen.
Aber die Frage bleibt ... Wie kann ich denn am besten Merker pro Instanz speichern die ich eigentlich in der DLL brauche?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: DLL mehrfach im Programm verwenden

  Alt 19. Jan 2009, 21:04
Genau wie bei Objekten. da erzeugt man auch eine Instanz und arbeitet mit dieser. Entsprechend kannst du (wie es in der Windows-Api häufig der Fall ist) einfach eine Struktur übergeben die von der DLL gehandhabt wird.

Bsp. (außerhalb der DLL):
Delphi-Quellcode:
type
  TTolleStruktur = packed record
    [...]
  end;
  PTolleStruktur = ^TTolleStruktur;

var
  meineStruktur: TTolleStruktur;
begin
  dll_function_init(@meineStruktur);
  dll_machwas(@meineStruktur);
  [...]
also einfach jedem Funktionsaufruf wo bisher die gloable verwendet wurde entsprechende Struktur mitgeben.

Im übrigen hat man das Problem nicht nur bei DLLs sondern auch bei Objectorientierter Programmierung (wenn mehrere Instanzen auf die gleiche globale zugreifen) etc.
Und genau aus diesem Grund sind globale Variablen auch so verpönt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: DLL mehrfach im Programm verwenden

  Alt 19. Jan 2009, 21:06
Hallo,

tja, dir bleibt wohl nichts anderes übrig,
als die Variable in deinem MDI-Fesnter zu merken
und als Parameter an dei DLL Funktion zu übergeben.

Pro Prozess sind globale DLL-Variablen das,
wie der Name schon sagt, global.


Heiko
Heiko
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

Re: DLL mehrfach im Programm verwenden

  Alt 19. Jan 2009, 21:14
Moin !

@SirThornberry:
So werde ichs wohl tun müssen.

Danke !
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#6

Re: DLL mehrfach im Programm verwenden

  Alt 21. Jan 2009, 21:41
Moin !

Ich habe mal eine Demoanwendung erstellt mit einer DLL. Die Aufrufe der DLL Methoden bekommen einen Zeiger mitgeliefert so wie es SirThornberry vorgeschlagen hat.

Das Konstrukt funktioniert sogar erstaunlich gut. Auch wenn ich die DLL mehrfach verwende klappt alles.

Ich wollte nur nochmal nachfragen ob an meinem Aufbau noch irgendwas nicht stimmt oder ob das ggf. noch anders löst. Möchte nur vermeiden da in neue Fallen zu tappen ...

Vor allem der Aufruf mit Formular aus der DLL raus ist für mich wichtig. Da würde mich mal interessieren ob das ein brauchbarer Weg ist. Funktionieren tut es jedenfalls prächtig


Und dann hät ich noch ne Randfrage zu meinem Type Konstrukt ...
Delphi-Quellcode:
type
  TDeviceInfos = packed record
    Test : String;
    Zahl : Double;
    Datum : TDateTime;
    Memo : TMemo;
  end;
Das muss ja sowohl in der EXE als auch in der DLL definiert sein. Nun brauchen wir aber nicht in jeder DLL den Zugriff z.B. auf das dort angegebene Memo. Wenn ich nun in der DLL das angebe:
Delphi-Quellcode:
type
  TDeviceInfos = packed record
    Test : String;
    Zahl : Double;
    Datum : TDateTime;
  end;
und in der EXE alles beim alten belasse dann funktionieren die Zugriffe trotzdem. Man darf allerdings nur Elemente von unten her wegnehmen. Ich denke weil sonst die Längen und damit die Zugriffe auf die einzelnen Elemente über den Pointer nimmer passen.
Also wie gesagt, das geht, aber nu stell ich mir doch die Frage ... Ist sowas erlaubt? Oder anders gefragt ... Kann das irgendwann man zu ungeahnten Problemen führen?
Angehängte Dateien
Dateityp: zip dll_test_189.zip (448,3 KB, 4x aufgerufen)
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: DLL mehrfach im Programm verwenden

  Alt 21. Jan 2009, 21:48
In Windows (und damit kann es ja mal nicht ganz schlecht sein, denn die Typen machen sich ja auch Gedanken)

ist es so gelöst, dass so eine Struktur am Anfang ein Byte/Word/Integer hat, in dem die Größe drinsteht.

Die Funktion kann jetzt in Abhängigkeit der Größe feststellen, welcher record das eigentlich ist.

Befüllt werden muss das Feld natürlich, etwa mit

Delphi-Quellcode:
var
  a: MyRec;
begin
  a.Size = sizeof(a)
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: DLL mehrfach im Programm verwenden

  Alt 21. Jan 2009, 21:52
Moin Julius,

nun eine Größenabfrage habe ich in meinem Konstrukt gar nicht mit drin. Funktionieren tut es dennoch.
Die Frage ist nur ob das überhaupt so gemacht werden sollte so wie ich es gemacht habe.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz