Moin,
Wie Ihr ja an meinen letzten Beiträgen seht, beschäftigt mich derzeit meine Unit TShellChangeNotifyEx, die ich upgeloadet habe, falls jemand den Quelltext braucht.
In der Unit muss auf einen Event reagiert werden, den das OS nach Registrierung durch SHChangeNotifyRegister an meine WndProc schickt. Dieser Event muss dispatched werden wozu es erforderlich ist, den überwachten Pfad IM NACHHINEIN daraufhin zu prüfen, ob er zu dem überwachten Pfad passt (meine Unit kann mehrere Pfade überwachen lassen, sodass WndProc mehrere unterschiedliche Events erhalten kann).
Für den Fall, dass der überwachte Pfad Teil des FileSystems ist, kannn ich das einfach machen mit
Delphi-Quelltext
1: 2: 3: 4:
| function MatchingPath(ANotifyPath, AEventPath: String): Boolean; begin Result := (ANotifyPath <> '') and (AEventPath <> '') and (Pos(ANotifyPath, AEventPath) = 1); end; |
Falls der überwachte Pfad aber ein (virtueller) ShellFolder ist, gibt's keinen Pfad. Wenn z.B. der "Computer" überwacht wird, gibt es zwar eine PIDL, aber eben keinen Pfad. Und als Event tritt dann ein Ereignis auf, das einen Pfad des FileSystems betrifft.
Ich bin also genötigt, einen Pfad des FileSystems (via PIDL) mit der PIDL daraufhin zu überprüfen, ob die zusammenpassen. Ich habe das versucht, wie folgt zu lösen:
Delphi-Quelltext
1: 2: 3: 4:
| function MatchingSysFolder(ANotifyPIDL, AEventPIDL: PITemIDList): Boolean; begin Result := SubItem(ANotifyPIDL, AEventPIDL); end; |
wobei SubItem wie folgt arbeitet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function TShChNotifyObject.SubItem(PIDL1, PIDL2: PItemIDList): Boolean; var Desktop, Folder: IShellFolder; NewPIDL: PItemIDList; begin try SHBindToParent(PIDL2, IID_ISHELLFOLDER, Folder, NewPIDL); Result := Folder.CompareIDs(0, PIDL1, PIDL2) > 0; except Result := false; end; end; |
Die Idee dahinter ist, festzustellen, ob das FileSystemObjekt, hier repräsentiert durch PIDL2, "SubTree" von PIDL1 ist - analog der Version für Pfade. Der Versuch mit dem (auskommentierten) BindToObject scheiterte. Und mit BindToParent funktionierts nur, wenn CompareIDs mit ">" arbeitet (was mich von der Theorie her ein wenig wundert!).
Weiß jemand Rat?
Danke und Gruß, Trutz
Und aus dem Chaos sprach eine Stimme zu mir: Lächle und sei froh, es könnte schlimmer kommen.