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.