AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Mutex-Handling in DLL für zwei Programme
Thema durchsuchen
Ansicht
Themen-Optionen

Mutex-Handling in DLL für zwei Programme

Ein Thema von TheSledgeHammer · begonnen am 22. Mai 2019 · letzter Beitrag vom 23. Mai 2019
Antwort Antwort
hoika

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

AW: Mutex-Handling in DLL für zwei Programme

  Alt 23. Mai 2019, 07:12
Hallo,
sobald du eine Methode in einer Klasse hast, wird das Self beim Methodenaufruf immer mit übergeben.
Ist halt so.

Entweder deine Dll-Methoden (im Programm) sind nicht in einer Klasse,
oder du änderst die Prozeduren in der Dll -> neuer Parameter Dummy: TObject.
Heiko
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: Mutex-Handling in DLL für zwei Programme

  Alt 23. Mai 2019, 08:25
Man kann sich viel Ärger ersparen, wenn man das erheblich einfacher umsetzt.

Hier mal die DLL
Delphi-Quellcode:
library TheMutex;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss die erste
  Unit in der USES-Klausel Ihrer Bibliothek UND in der USES-Klausel Ihres Projekts
  (wählen Sie 'Projekt-Quelltext anzeigen') sein, wenn Ihre DLL Prozeduren oder Funktionen
  exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Dies
  gilt für alle Strings, die an oder von Ihrer DLL übergeben werden, auch für solche,
  die in Records und Klassen verschachtelt sind. ShareMem ist die Interface-Unit zur
  gemeinsamen BORLNDMM.DLL-Speicherverwaltung, die zusammen mit Ihrer DLL
  weitergegeben werden muss. Übergeben Sie String-Informationen mit PChar- oder ShortString-Parametern, um die Verwendung von BORLNDMM.DLL zu vermeiden.
}


uses
  System.SysUtils,
  System.Classes,
  TheMutexImplementation in 'TheMutexImplementation.pas';

{$R *.res}

exports
  MutexAcquire,
  MutexRelease;

begin
end.
Delphi-Quellcode:
unit TheMutexImplementation;

interface

procedure MutexAcquire(); stdcall;
procedure MutexRelease(); stdcall;

implementation

uses
  System.SyncObjs,
  System.SysUtils;

var
  _Mutex: TMutex;

procedure MutexAcquire();
begin
  _Mutex.Acquire();
end;

procedure MutexRelease();
begin
  _Mutex.Release();
end;

initialization

_Mutex := TMutex.Create(nil, false, 'MyUniqueMutexName');

finalization

FreeAndNil(_Mutex);

end.
Und nun noch den benötigten Wrapper für die Dll
Delphi-Quellcode:
unit TheMutexWrapper;

interface

uses
  Winapi.Windows;

procedure MutexAcquire(); stdcall;
procedure MutexRelease(); stdcall;

const
  TheMutexDll = 'TheMutex.dll';

implementation

procedure MutexAcquire(); external TheMutexDll name 'MutexAcquire';
procedure MutexRelease(); external TheMutexDll name 'MutexRelease';

end.
  Mit Zitat antworten Zitat
TheSledgeHammer

Registriert seit: 22. Mai 2019
Ort: Mulfingen
43 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Mutex-Handling in DLL für zwei Programme

  Alt 23. Mai 2019, 08:37
Man kann sich viel Ärger ersparen, wenn man das erheblich einfacher umsetzt.
Sieh es mir bitte nach, aber DAS find ich beim besten Willen nicht einfacher Vielleicht "korrekter" aus programmiertechnischer Sicht, wenn es so etwas gibt. Ich mein, was hast du denn gemacht? Am Ende eine Unit erzeugt, die du mit initialization und finalization ausstatten konntest, sodass das Create und Free nicht in Funktionen gepackt werden muss. Wenn ich den Mutexnamen jetzt übergeben möchte, wird's allerdings schwierig und auch das Registrieren des Mutex kann ich nicht steuern damit. Und dynamisch laden wollt ich die DLL schon auch, also die "externals" wären an der Stelle für mich sowieso nicht gegangen; das kannst du aber natürlich nicht wissen, hatte ich auch nie erwähnt

Aber der Hinweis mit dem "of object" hat da tatsächlich geholfen, passt ja auch wunderbar zum Fehlerbild. Danke dafür, die jetzt anstehenden Tests werden es zeigen, aber sieht bisher ganz vielversprechend aus.

Entweder deine Dll-Methoden (im Programm) sind nicht in einer Klasse,
oder du änderst die Prozeduren in der Dll -> neuer Parameter Dummy: TObject.
Ja das mit dem Error-Callback war nicht in der DLL sondern das war ein Attribut einer anderen Klasse. Ich wollte damit auf den Unterschied zwischen DLL-Prozeduren und Klassen-Prozeduren hinaus, dass man beim ersteren kein "of object" verwenden darf und aber beim zweiten sogar verwenden muss. Der Grund ist mir wie gesagt ja jetzt klar
Tobias

Geändert von TheSledgeHammer (23. Mai 2019 um 08:44 Uhr)
  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 18:15 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-2025 by Thomas Breitkreuz