So ich habe es versucht, aber ich bekomme die MSE Library nicht kompiliert. Da das MSDN aber eigentlich recht gut dokumentiert ist, habe ich es mal selbst versucht. Und siehe Da meine Klasse Erkennt File und Directory Changes wunderbar (zumindest unter Windows).
Nun habe ich aber das Problem, dass Heaptrace mir jedesmal, wenn meine Anwendung eine Notification entdeckt, sagt dass ich 24 Byte verliere (siehe Screenshot)
Wenn ich die Anwendung starte und wieder beende, ohne dass es eine Notification gibt. Dann ist Heaptrace zufrieden.
Kann mir einer von euch weiter helfen ?
Habe hier mal meine Klasse auf das nötigste Runtergebrochen. Der Fehler wird so immer noch erzeugt :
Code: Alles auswählen
(* Informations Taken from :
*
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx // ReadDirectoryChangesW
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa364391%28v=vs.85%29.aspx // FILE_NOTIFY_INFORMATION
*
* http://msdn.microsoft.com/en-us/library/aa365261%28v=vs.85%29.aspx // Obtaining Directory Change Notifications
*)
Unit cn_monitor;
{$MODE objfpc}{$H+}
Interface
Uses
Classes, SysUtils, windows;
Type
TDirectoryChangeEvent = Procedure(Sender: tobject; Directory: String) Of Object;
TFileChangeEvent = Procedure(Sender: tObject; Filename: String) Of Object;
TReport = Record
Value: String; // Name of the Directory or Filename
IsFile: Boolean; // Selector for File or Directory
End;
{ TCnMonitor }
TCnMonitor = Class(tThread) // Die Klasse, welche das Monitoring Bereit Stellt
private
fTWOHandleArray: TWOHandleArray;
FRunning: Boolean;
Procedure Report();
protected
Procedure Execute; override;
public
OnDirectoryChangeEvent: TDirectoryChangeEvent;
OnFileChangeEvent: TFileChangeEvent;
Property IsRunning: Boolean read FRunning;
Constructor Create();
Destructor Destroy; override;
End;
Implementation
{ TCnMonitor }
Procedure TCnMonitor.Execute;
Var
obj: DWORD;
Begin
While Not Terminated Do Begin
obj := WaitForMultipleObjects(1, @fTWOHandleArray, false, 10);
If obj = WAIT_OBJECT_0 Then Begin
//Wird dieser Code Aufgerufen, dann gibts ein Memory Leak von 24 Byte
Synchronize(@Report);
FindNextChangeNotification(fTWOHandleArray[0]);
End;
sleep(1);
End;
FRunning := False;
End;
Procedure TCnMonitor.Report;
Begin
OnFileChangeEvent(self, 'c:\temp\');
End;
Constructor TCnMonitor.Create;
Begin
Inherited create(false);
FRunning := True;
fTWOHandleArray[0] := FindFirstChangeNotificationW('c:\temp\', false, 31);
End;
Destructor TCnMonitor.Destroy;
Begin
Terminate;
While IsRunning Do Begin
Sleep(1);
End;
FindCloseChangeNotification(fTWOHandleArray[0]);
End;
End.