AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TDirMonitor / ReadDirectoryChanges

Ein Thema von doctor-x · begonnen am 5. Jan 2012 · letzter Beitrag vom 23. Mai 2017
Antwort Antwort
doctor-x

Registriert seit: 29. Apr 2007
41 Beiträge
 
#1

TDirMonitor / ReadDirectoryChanges

  Alt 5. Jan 2012, 23:50
Hallo,

nach dem ich mich durch etliche Beiträge gewühlt habe und viele Varianten ausprobiert habe und keine fehlerfrei funktionierte habe ich jetzt endlich mal eine die seit Monaten fehlerfrei arbeitet.

Ich nutze TDirMonitor von JUAN CARLOS MOLINOS MESA. Diese arbeitete aber nicht fehlerfrei, ich hatte bei etlichen versuchen sporadische thred Fehler, Sonderzeichen und abgeschnittene Pfad angaben oder auch einen totalen Hänger des Programms.

Mit folgenden Änderungen hat es dann letztendlich doch noch zum Erfolg geführt:

Original:
Code:
Offset: Longint;
Ersetzt durch:
Code:
Offset: DWORD;
Original:
Code:
name:=WideCharToString(@(FileOpNotification^.FileName));
Ersetzt durch:
Code:
name:=WideCharLenToString(@(FileOpNotification^.FileName), FileOpNotification^.FileNameLength div 2);
Original:
Code:
PChar(FileOpNotification) := PChar(FileOpNotification) + Offset;
Ersetzt durch:
Code:
PByte(FileOpNotification) := PByte(FileOpNotification) + Offset;
Einbinden in den Units "RDCWDirMonitor" und "ProcessMonitor" der Units "ShlObj", "ActiveX" und "FileCtrl"

Dies hat nun zum Erfolg geführt.
Das einbinden der Units und die Type änderung des Offsets und eventuell auch andere Änderungen sind vermutlich nicht nötig, aber ich war das weitere rumprobieren satt. So funktioniert es in jedem Fall bei mir auf zwei Rechnern mit Englischem Win2000 und auf zwei Rechnern mit Englischem WinXP seit Monaten fehlerfrei. (Compiliert in Delphi XE unter Win7 Pro X64)

Ich hoffe ich kann damit den anderen die diese Probleme habe / kennen, den weg zum Erfolg etwas verkürzen.
Anbei noch die so geänderte Komponente. (Die Demo entspricht nicht 100% der original Version)

MfG
Angehängte Dateien
Dateityp: zip DirMonitor.zip (32,3 KB, 184x aufgerufen)
Wolf
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: TDirMonitor / ReadDirectoryChanges

  Alt 6. Jan 2012, 07:35
Das liegt an der unterschiedlichen Definition von 'Char' in den Delphi-Versionen. Früher war das ein Byte, heute sind das zwei.
Du müsstest entweder komplett auf WideChar umschwenken und die entsprechenden Windows-API Funktionen nutzen, oder komplett auf AnsiChar.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TDirMonitor / ReadDirectoryChanges

  Alt 6. Jan 2012, 11:16
<NaiveFrage>
Ginge das auch mit sizeof(Char) und allem, das dazugehört?
</NaiveFrage>
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
doctor-x

Registriert seit: 29. Apr 2007
41 Beiträge
 
#4

AW: TDirMonitor / ReadDirectoryChanges

  Alt 6. Jan 2012, 19:16
Das es an der Umstellung des Types PChar liegt habe ich mir fast gedacht.

Ich meine aber es mit PAnsiChar probiert zu haben (ohne Erfolg), kann mich aber auch irren.

Ich wollte diesen Erfolg hier nur veröffentlichen, da ich kein funktionierendes Beispiel hier finden konnte und anderen die mühevolle Sucherei und Probiererei sparen wollte, die sich mit diesem Thema in naher Zukunft konfrontiert sehen^^

Es gibt bestimmt noch ein Dutzend andere Lösungen, aber solange es funktioniert, braucht man ja nicht das Rad neu zu erfinden.

MfG
Wolf
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TDirMonitor / ReadDirectoryChanges

  Alt 6. Jan 2012, 20:33
Die Komponente ruft eine Windows-API-Funktion auf.
Und bei einem Unicode-Delphi wird auch automatisch die Unicode-Version der API aufgerufen.
Darum funktioniert das auch mit AnsiChar nicht
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: TDirMonitor / ReadDirectoryChanges

  Alt 6. Jan 2012, 20:44
Nimmt man dann die API-Funktionen, die auf xxxxxA enden?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: TDirMonitor / ReadDirectoryChanges

  Alt 6. Jan 2012, 22:03
Nimmt man dann die API-Funktionen, die auf xxxxxA enden?
öh, ja ... A=Ansi, W=Wide
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: TDirMonitor / ReadDirectoryChanges

  Alt 23. Mai 2017, 13:42
Ich wollte kein neues Thema aufmachen und deshalb frage ich trotz des Alters von 5 Jahren mal hier nach:

TDirMonitor von JUAN CARLOS MOLINOS MESA funktioniert bei mir (XE5) so lange, bis ich versuche es zu deaktivieren. Dann stürzt das Programm vom BS her (Win10 Pro) ab und ich sehe auch im Debugger nicht, woran es liegt. Außerdem benötige ich die Funktionalität für ein Konsolen-Programm und habe daher u.a. Probleme mit der Ableitung von TComponent.
Langer Rede kurzer Sinn: ich möchte es gern verstehen und nachbauen.

Wenn ich das richtig deute, findet die eigentliche Arbeit in dem Thread (ProcessMonitor.pas ) statt?
In RDCWDirMonitor.pas wird "nur" vorab geprüft, ob man das 1. Handle für das Verzeichnis, 2. einen I/O-Port für dieses Verzeichnishandle erzeugen und man 3. ReadDirectoryChanges(); überhaupt ausführen kann - erst dann wird der Thread erzeugt.
Im Thread wiederum lauert man mit GetQueuedCompletionStatus(); darauf, dass sich etwas geändert hat und liest es dann ebenfalls mit ReadDirectoryChanges(); aus und feuert das Ereignis.

Habe ich das so richtig verstanden?

GetQueuedCompletionStatus(); habe ich auch als Verursacher für den Absturz im Verdacht. Das scheint selbst blockierend zu sein und damit kommtif self.Terminated then quit:=true nicht mehr zum Zuge - er wartet sich tot.
Ich würde mich freuen, wenn sich trotz der langen Zeit mal jemand dazu äußern könnte, damit ich umbauen kann. Hilfreich wäre es wohl allemal wegen, um meine Probleme mit dem Absturz zu klären.
Alex Winzer
  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 15:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz