Hallo Community,
ich sitze hier gerade an einem sehr "interessanten" (man könnte auch nervig dazu sagen...) Phänomen, das ich mir nicht so recht erklären kann.
Zunächst mal kurz die Motivation:
Es gibt hier zwei Prozesse, die sich eine INI-Datei teilen. Der eine Prozess ist eine EXE-Datei in Delphi geschrieben (32 bit), der andere ist ein Matlab-Skript. Beide Prozesse schreiben und lesen diese INI-Datei, daher ist eine Synchronisation absolut notwendig. Das wollte ich mit einer
DLL realisieren, die einen
Mutex erzeugt. Eine
DLL deshalb, weil Matlab wohl das Prinzip der Mutexe nicht unterstützt und ich dem Entwickler somit dieselbe Funktionalität zur Verfügung stellen kann.
Es gibt 4 Methoden, die die
DLL zur Vefügung stellt: Register, UnRegister, Acquire und Release. In der
DLL wiederum gibt es eine globale Variable FMutex (Vom Typ System.SyncObj.TMutex), die über die komplette Laufzeit hinweg gehalten wird. Register macht ein Create, UnRegister ein Free und Acquire bzw. Release sind ja selbsterklärend.
Jetzt kommt der Clou: Wenn ich diese 4 Methoden einfach im Delphi-Programm "hart rein programmiere", dann klappt das alles wie am Schnürchen. Sobald diese Methoden aber in der
DLL stehen und aufgerufen werden, fliegt mir das Programm um die Ohren wie eine Kuh bei einem Tornado.
Hier mal die
DLL:
Delphi-Quellcode:
uses
System.SysUtils,
System.Classes,
System.SyncObjs;
{$R *.res}
var
FMutex: TMutex;
procedure RegisterMutex(); stdcall;
begin
if not Assigned(FMutex) then
FMutex := TMutex.Create(nil, false, 'MyUniqueMutexName');
end;
procedure UnRegisterMutex(); stdcall;
begin
if Assigned(FMutex) then
FMutex.Free;
end;
procedure AcquireMutex(); stdcall;
begin
if Assigned(FMutex) then
FMutex.Acquire;
end;
procedure ReleaseMutex(); stdcall;
begin
if Assigned(FMutex) then
FMutex.Release;
end;
exports
RegisterMutex,
UnRegisterMutex,
AcquireMutex,
ReleaseMutex;
begin
end.
In dem Delphi-Programm, das ich auch entwickle, lade ich die
DLL mittels LoadLibrary und hole mir die 4 Methoden über GetProcAddress. Die rufe ich dann an den entsprechenden Stellen auf.
Hat irgendwer von euch schon Mal so ein Konstrukt gebaut oder verwendet?