Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mehrfaches einbinden von DLL verhindern. (https://www.delphipraxis.net/118698-mehrfaches-einbinden-von-dll-verhindern.html)

Viktorii 13. Aug 2008 08:22


Mehrfaches einbinden von DLL verhindern.
 
Moin,
ich habe eine DLL geschrieben, die von mehreren von mir geschriebenen Programmen benutzt werden kann. Nun möchte ich, dass nicht mehr als ein Programm gleichzeitig diese DLL nutzen kann, da die in der DLL enthaltenen Funktionen nicht parallel ausgeführt werden dürfen.
Ich möchte also dass wenn ein zweites Programm geöffnet wird, welches die DLL benutzt, ein Meldung erscheint und das Programm anschließend geschlossen wird.
Wie kann ich das realisieren?
Vielen Dank

mkinzler 13. Aug 2008 08:26

Re: Mehrfaches einbinden von DLL verhindern.
 
Das Laden der Dll erfolgt durch Windows. Du müsstest die Sperrverwaltung also manuell implementieren

Luckie 13. Aug 2008 08:27

Re: Mehrfaches einbinden von DLL verhindern.
 
Warum dürfen die Funktionen nicht parallel ausgeführt werden? Jedes Programm, welches die DLL läd bekommt eine eigene Kopie der Daten - auch der globalen Varaiablen, da sollte nichts passieren.

Viktorii 13. Aug 2008 08:34

Re: Mehrfaches einbinden von DLL verhindern.
 
Zitat:

Zitat von mkinzler
Das Laden der Dll erfolgt durch Windows. Du müsstest die Sperrverwaltung also manuell implementieren

Das habe ich mir schon gedacht. Die Frage ist nur wie? Für meine Programme habe ich diese Unit, welche ich einfach in das Projekt einbinde:

Delphi-Quellcode:
unit MultipleAppicationNotifyer;

interface

implementation
uses
  Windows, Dialogs, SysUtils, Forms;

var
  mHandle      : THandle;

initialization
  mHandle := CreateMutex(nil, True, pChar(Application.Title));

  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    CreateMessageDialog('Application already running!', mtWarning, [mbOk]).ShowModal;
    Halt;
  end;


finalization
  if mHandle <> 0 then
    CloseHandle(mHandle)

end.
Funktioniert super. Aber wie mache ich das bei ner DLL?


Zitat:

Zitat von Luckie
Warum dürfen die Funktionen nicht parallel ausgeführt werden? Jedes Programm, welches die DLL läd bekommt eine eigene Kopie der Daten - auch der globalen Varaiablen, da sollte nichts passieren.

Weil ich dort auf USB Geräte zugreife. Wenn Kommunikation im Gange ist bzw. das USB-Gerät irgendwelche Aufgaben ausführt und dann ein zweites Programm dazwischenfunkt, es zu Fehlern kommen kann. Das möchte ich so verhindern.

QuickAndDirty 13. Aug 2008 08:57

Re: Mehrfaches einbinden von DLL verhindern.
 
Die DLL könnte versuchen einen IPC oder TCP/IP(auf localhost) server zu erreichen. Wenn der nicht antwortet dann macht sie selbst einen auf, ansonsten sperren sich die Funktionen oder eine Funktion liefert wenn sie abgefragt wird den Sperrstatus und die Anwendungen müssen sich dann daran halten.

Sherlock 13. Aug 2008 09:09

Re: Mehrfaches einbinden von DLL verhindern.
 
Wie wäre es mit eine Semaphoredatei? Da spart man sich den TCP/IP Overhead.

Sherlock

Arnulf 13. Aug 2008 09:54

Re: Mehrfaches einbinden von DLL verhindern.
 
was hast du gegen den mutex?

ist doch wunderbar das ding.
du könntest den mutex auch einfach locken wenn deine .dll geladen wird.
semaphoren würde ich dann verwenden wenn du die .dlls doch in den anderen programmen verwenden willst, aber synchronisiert eben.

wenn du die .dll aber nur einmal haben willst ( was am sinn der .dll vorbei geht ) dann eben mutex.

lg
Arnulf

Luckie 13. Aug 2008 10:20

Re: Mehrfaches einbinden von DLL verhindern.
 
Kommt man nicht irgendwie an den Referenzzähler von Windows für die DLL dran? Wenn der grö0er null ist, darf das Programm die DLL nicht laden. Und damit du eine Kontrolle darüber hast, würde ich sie dynamisch laden (natürlich dann auch in deinen anderen Programmen).

brechi 13. Aug 2008 11:42

Re: Mehrfaches einbinden von DLL verhindern.
 
warum denn nicht:

Delphi-Quellcode:
  mHandle := CreateMutex(nil, True, 'bineinetolleDLL');

  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    CreateMessageDialog('Application already running!', mtWarning, [mbOk]).ShowModal;
    Halt;
  end;
Der Referenzzähler einer DLL ist lokal für jedes Programm.

Gibt so viele Möglicheiten, warum denn nen Mutex nehmen?

OldGrumpy 13. Aug 2008 13:01

Re: Mehrfaches einbinden von DLL verhindern.
 
Zitat:

Zitat von Viktorii
Zitat:

Zitat von Luckie
Warum dürfen die Funktionen nicht parallel ausgeführt werden? Jedes Programm, welches die DLL läd bekommt eine eigene Kopie der Daten - auch der globalen Varaiablen, da sollte nichts passieren.

Weil ich dort auf USB Geräte zugreife. Wenn Kommunikation im Gange ist bzw. das USB-Gerät irgendwelche Aufgaben ausführt und dann ein zweites Programm dazwischenfunkt, es zu Fehlern kommen kann. Das möchte ich so verhindern.

Dazu böte es sich an, einfach das USB-Device (ich vermute mal es wird eh per CreateFile geöffnet?) einfach exklusiv zu öffnen und fertig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr.
Seite 1 von 2  1 2      

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