AGB  ·  Datenschutz  ·  Impressum  







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

Mehrfaches einbinden von DLL verhindern.

Ein Thema von Viktorii · begonnen am 13. Aug 2008 · letzter Beitrag vom 18. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 09:22
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 09:26
Das Laden der Dll erfolgt durch Windows. Du müsstest die Sperrverwaltung also manuell implementieren
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 09:27
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#4

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 09:34
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 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.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#5

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 09:57
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#6

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 10:09
Wie wäre es mit eine Semaphoredatei? Da spart man sich den TCP/IP Overhead.

Sherlock
Oliver
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#7

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 10:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 11:20
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).
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#9

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 12:42
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?
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Mehrfaches einbinden von DLL verhindern.

  Alt 13. Aug 2008, 14:01
Zitat von Viktorii:
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.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  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 17:48 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