Autor Beitrag
ASMFreak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 9



BeitragVerfasst: Do 08.07.10 20:37 
Moin, Ihr da draußen.

Ich habe mal wieder etwas, das dem einen oder anderen nützlich sein könnte. Es handelt sich um eine Ablösung des TShellChangeNotify aus ShellCtrls, das wirklich aufs Altenteil gehört :motz: . Ich lade heute erstmal die Unit und eine Demo hoch :P , morgen kommt dann das dicke Ende :puke: : Denn umsonst ist der Tod, und der kostet das Leben!


Die Unit funktioniert hervorragend (zumindest bei mir :dance2:) und ist eingentlich fertig. Dennoch habe ich noch ein paar Fragen, die ich dann ab morgen sukzessive ansprechen werde. Hoffentlich weiß jemand Rat.

Doch nun zu TShellChangeNotifyEx:


Abgrenzung gegenüber TShellChangeNotify:

- TShellChangeNotifyEx KANN MIT (praktisch allen) SHELLFOLDERn ARBEITEN, ALSO AUCH MIT SPECIALFOLDERn, DIE NICHT TEIL
DES FILESYSTEMS SIND. So lassen sich Änderungen an Laufwerken, dem Papierkorb, Druckern, der Netzwerkumgebung u.ä.
überwachen.
TShellChangeNotify kann sich nur im FileSystem bewegen!

- TShellChangeNotifyEx KOMMT OHNE THREAD AUS. Die Klasse veranlasst das Betriebssystem, sich bei ihr zu melden, wenn
sich am beobachteten Objekt etwas geändert hat.
TShellChangeNotify bemüht den Thread TShellChangeThread, um über Änderungen am ausgewählten Verzeichnis informiert zu
werden. Dieser Thread macht nichts anderes, als mittels WaitForMultipleObjects auf ein Ereignis zu warten, das durch
die API-Funktonen FindFirstChangeNotification / FindNextChangeNotification generiert wird.

- Pro überwachtem Verzeichnis muss eine Instanz von TShellChangeNotify erzeugt werden. Zwar kann TShellChangeNotify auch
die Unterverzeichnisse des angegebenen Verzeichnisses berücksichtigen, mehr aber auch nicht.
TShellChangeNotifyEx dagegen muss nur einmal instanziiert werden. Code, der etwas überwacht haben möchte, meldet sich
bei TShellChangeNotifyEx an bzw. ab. Das erlaubt es, pro Applikation nur eine Instanz der Klasse laufen zu lassen: Es
wird alles zentral und an einer Stelle gehandelt. (Was nicht bedeutet, dass es nicht möglich ist, mehrere Instanzen
von TShellChangeNotifyEx zu erzeugen, die sich nicht gegenseitig in die Quere kommen!)

- Mit TShellChangeNotifyEx ist die Überwachung des gesamten FileSystems möglich, mit TShellChangeNotify nicht.

- Die Möglichkeiten der Überwachung durch TShellChangeNotify sind beschränkt auf
- Änderung des Dateinamens,
- Änderung des Verzeichnisnamens,
- Änderung der Attribute,
- Änderung der Dateigröße,
- Änderung des "last write"-Dateieintrages und
- Änderung des Sicherheits-Descroptors.
TShellChangeNotifyEx dagegen hat sehr viel mehr Möglichkeiten der Überwachung: Neben der
- Erzeugung, Löschen, Umbenennen und Ändern von Dateien
- Erzeugung, Löschen, Umbenennen und Ändern von Verzeichnissen
- Änderung von Attributen von Dateien und Verzeichnissen,
die in etwa den Möglichkeiten von TShellChangeNotify entsprechen, sind auch das/die
- Änderung der "file type association", also der Zuordnung eines Standardprogramms
- Hinzufügen und Entfernen von Laufwerken
- Einlegen und Entfernen von Medien
- Änderungen an der Größe des freien Speicherplates eines Laufwerkes
- Netzwerk-Freigabe und Rücknahme der Netzwerk-Freigabe von Verzeichnissen und
- Abmeldung bei einem Server
möglich

Anbei ist neben der Unit auch ein Demoprogramm. Hier eine kurze Einweisung:

Das Form besteht aus drei Bereichen:
- einer Ansammlung von Checkboxen und anderen Controls im oberen Bereich des Forms,
- den beiden "Requestoren" in Gestalt zweier nebeneinander liegenden Listboxen im mittleren Bereich des Forms und
- den beiden Memos mit ein par Labels, die die Ergebnisse der Überwachung darstellen (unterer Bereich).

Der obere Bereich dient dazu, die zur Überwachung eines Objektes notwendigen Einstellungen vorzunehmen. So ist mit den Checkboxen einstellbar, welche Eigenschaften eiens Objekts überwacht werden sollen. Unter der GroupBox "Sources" kann angegeben, welche Systemereignisse zum Auslösen eines Events führen sollen: SheeEvents und/oder InterruptEvents. Mit den Radiobuttons ist einstellbar, ob die (veraltete) Benachrichtigugsart aus Win98-Tagen genutzt werden soll oder die neue ab XP. Die Combobox enthält die SystemShellFolders, die TShellChangeNotifyEx unterstützt.

Mit den Listboxen im mittleren Bereich werden die auszulösenden Objekte ausgewählt. Beide Listboxen sind identisch, sie unterscheiden sich nur in der Art, wie sie von TShellChangeNotifyEx über einen Event informiert werden und wie sie sich bei dieser Klasse anmelden: ListBox1 wird über eine CallBack-Prozedur direkt bei Auftreten des Ereignisses informiert, ListBox2 über eine Botschaft, die an eine Botschaftroutine des Forms geschickt wird. ListBox1 kommuniziert mit TShellChangeNotifyEx über ein "Handle", das sie erhalten hat, ListBox2 über einen Identitätsnachweis (für Details, siehe die sehr ausführlich kommentierte Unit!)

Die Events, die ListBox1 erhält, werden in der Memo darunter angezeigt. Analoges gilt für Listbox2. Unter den beiden Memos finden sich not vier Labels, die den aktuellen Zustand beschreiben: Die Anzahl überwachter Objekte der jeweiligen ListBox, die Anzahl tatsächlich überwachter Objekte und die Anzahl registrierter Objekte. Auch hier: Details siehe Unit!

Viel Spaß!

Gruß, Trutz
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: jaenicke, spawn89