Zitat von
Reinhard Kern:
Versuch doch, sie selbst exklusiv zu öffnen. Wenn das geht, hat sie sonst niemand offen.
Ich will ja nichts sagen, da es im meistens stimmt...
aber ...
Na ja, im Anhang sind 3 Programme:
Project3 erstellt 'ne Datei und hällt sie geöffnet - der Inhalt wird ausgelesen und angezeigt.
Project4 öffnet diese Datei mit
exclusiven Rechten und schreibt was rein.
(könnt euch ja im QuellCode vergewissern)
Project5 öffnet die Datei mit Sharingrechten, ließt/schreibt den Inhalt und zeigt ihn an.
Das, was Project4 und Project5 machen, nochma im Kurzen...
Delphi-Quellcode:
// Project4
FH := CreateFile(PChar('
Project3.dat'), GENERIC_READ
or GENERIC_WRITE,
0
{kein FILE_SHARE_READ und FILE_SHARE_WRITE},
nil, OPEN_ALWAYS, 0, 0);
If FH = INVALID_HANDLE_VALUE
Then Raise Exception.Create('
Can''
t open the file.');
While ...
do Begin
i := Random(MaxInt);
SetFilePointer(FH, 0,
nil, FILE_BEGIN);
WriteFile(FH, i, 4, W,
nil);
Edit1.Text := IntToStr(i);
End;
CloseHandle(FH);
Wie man sieht ... keine SharingRecht.
Delphi-Quellcode:
// Project5
FH := CreateFile(PChar('
Project3.dat'), GENERIC_READ
or GENERIC_WRITE,
FILE_SHARE_READ und FILE_SHARE_WRITE,
nil, OPEN_ALWAYS, 0, 0);
If FH = INVALID_HANDLE_VALUE
Then Raise Exception.Create('
Can''
t open the file.');
While ...
do Begin
SetFilePointer(FH, 0,
nil, FILE_BEGIN);
ReadFile(FH, i, 4, W,
nil);
Edit1.Text := IntToStr(i);
End;
CloseHandle(FH);
Aber nun mal zum Grund:
[quote="
MSDN - CreateFile"]dwShareMode
[in] Sharing mode of the object (reading, writing, both, or neither).
You cannot request a sharing mode that conflicts with the
access mode specified in a previous open request
whose handle is still open.
Dieses gilt also nur für "offene" FileHandles ... Project3 jedoch öffnet/erstellt die Datei zwar per
FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);
aber schließt daß FileHandle danach wieder.
Demnach würde "... alle Handles per Treiber zusammenkratzt und überprüfst..." leider auch nicht funktionieren. :tonque:
Selbst über FileMon und den ProcessExplorer bekommen man nichts von einem FileHandle in Project3 mit.
(OK, es gibt ja Keines mehr)
Also, für'n "Normalfall" sollte das Öffnen mit exclusiven Rechten vollkommend ausreichend sein
und der winzige Rest wird wohl ein bissl zu aufwendig werden. :engel:
Ich kenn jedenfalls noch keine andere wirkungsvolle Methode dieses "schnell/einfach" zu prüfen.
- Project3 und danach Project4 starten = Datei läßt sich exclusiv öffnen
- Project5 und danach Project4 starten = Datei läßt sich nicht exclusiv öffnen
- Project4 und danach Project5 starten = Datei läßt sich nicht öffen, da bereits exclusiv geöffnen
- Project5 mehrmals starten = Datei läßt sich öffnen
Sollte ja auch Aufgrund der SharingRechte so sein.
- Project5 und Project3 können natürlich beliebig oft gestartet werden.
Kein Wunder, denn der Aufruf von CreateFile ist ganz genau gleich und mit SharingRechten