![]() |
SHChangeNotifyRegister + NT (W2k3) Dienst
Servus!
Ich hab ne Frage zur Windows API mit der Funktion SHChangeNotifyRegister. Ist es möglich SHChangeNotifyRegister in nem Dienst zu benutzen? Es braucht ja nen HWnd, nen Dienst hat aber keins... Hintergrund: Da es (laut Microsoft) nicht möglich ist, dem "Owner" eines Verzeichnisses die Rechte zum Berechtigungen vergeben zu entziehen, möchte ich gerne einen Dienst haben, der, wenn jemand einen Ordner erstellt, den Besitzer auf z.B. die Administratoren Gruppe umbiegt. Ich hab das ganze schon als normale Win32-App und es funktioniert, wie ich mir das vorgestellt hab: Ordner wird im Dateisystem erstellt, SHChangeNotify wird ausgelöst und ich setze den Besitzer auf "Adminstrators". Problem: Als Dienst nicht möglich, da SHChangeNotifyRegister kein HWnd gegeben werden kann :cry: ... siehe Delphi Hilfe -> Windows Shell and Controls. Versionen: Delphi 2005 Windows Server 2003 Danke im vorraus, Imp |
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
Natürlich kannst du ein Fensterhandle übergeben. Ich würde dir empfehlen mit CreateWindowEx() ein Fenster zu erstellen und es an einen Thread zu übergeben, der dann die Nachrichtenschleife startet.
Kann auch sein, daß eine Nachrichtenschleife ohne Fenster ausreicht (mußt du aber selber testen!). |
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
Hi.
Im Moment benutze ich die "TSHChangeNotify component by Elliott Shevin", die biegt ja die WindowProc-Schleife vom Owner um und ich bin garnicht direkt an der API Funktion dran. Das würde heissen, ich muß mir die Komponente schnappen und umschreiben oder am besten nen eigenen Wrapper für die ChangeNotifyRegister Geschichte machen... Aber das mit der Nachrichtenschleife war schonmal ein guter Tip für die weitere Vorgehensweise, danke. :hi: Ok, ich werd das mal versuchen, ich poste dann nochma hier. |
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
Alles Klar. Dann bin ich mal gespannt.
Aber solltest du (bei dieser Kompo) nicht auch in der Lage sein ein Fenster zu erstellen - mit VCL-Mitteln und dann als Owner zu übergeben? Einzige Sache ist doch, daß von einem Service das Fenster in der jeweiligen WinSta (und Desktop) des Services nicht interaktiv sichtbar ist. |
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
Zitat:
Zitat:
Zitat:
Ich poste hier den Status und, wenn es soweit ist, die Lösung, falls noch mehr Leute Dienste mit "HWnd-Brauchenden" Funktionen schreiben wollen.. Bis denne |
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
GRRRR, ich kriegs nich hin... Ich hab zwar ne Form und alles aber SHChangeNotifyRegister gibt kein Notification Handle zurück sondern immer 0... :wall: :wall:
Kann mir jemand auf die Sprünge helfen? (Hab jetzt erstmal keinen Code geposted, um den Thread nich so vollzumüllen...) Danke, Imp |
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
Moin Imp,
die Funktion gibt ja auch kein Handle zurück. 0 bedeutet, dass ein Fehler aufgetreten ist. Entweder Speichermangel, oder es liegt ein Paramterfehler vor. Zitat:
|
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
Nochmal hallo!
Also: Ich hab die "TSHChangeNotify component by Elliott Shevin" [1] und möchte diese gerne auch benutzen, weil da genau das richtige Event (sprich: MkDir) drinne ist. Das Problem ist, dass ich die gerne in nem Dienst benutzen möchte (also in nem Standard Delphi Dienst TService) und da aber kein Owner, wie es die Komponente braucht, existiert.
Delphi-Quellcode:
Und dann kommt auch noch das WindowHandle von dem Owner für SHChangeNotifyRegister dran:OwnerWindowProc := (Owner as TWinControl).WindowProc; (Owner as TWinControl).WindowProc := WndProc;
Delphi-Quellcode:
Das hab ich in nem Dienst ja alles nich :(
NotifyHandle := SHChangeNotifyRegister(
(Owner as TWinControl).Handle, SHCNF_ACCEPT_INTERRUPTS + SHCNF_ACCEPT_NON_INTERRUPTS, EventMask, fMessageNo, NotifyCount, NotifyPtr); Wenn ich die Komponente einfach auf diese Dienst-Pseudo-Form draufmache gibts nen invalid Typecast (beim WindowProc umbiegen), was ja auch irgendwie einleuchtet und wenn ich ne TForm (oder wie Olli vorgeschlagen hat mit CreateWindowEx) mache kann SHChangeNotifyRegister irgendwie nix registern (NotifyHandle bleibt 0). Das Ganze funktioniert einwandfrei wenn ich ne normale Win32-Anwendung mache. Aber es muss, wie gesagt, auch ohne das jemand angemeldet ist laufen und ich mag nicht wirklich so ein "Lass-meine-Anwendung-als-Dienst-laufen"-Programm benutzen... Danke im voraus, Imp Edit: P.S. Diese ShellControls-Beispiel Komponente funktioniert in nem Dienst aber die springt immer an und ich weiss nicht, wie ich rauskriegen soll, ob jetzt nen Verzeichnis angelegt worden ist oder nur irgendwas anderes passiert is.. GRRR :wall: [1] ![]() |
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
*push* :duck:
|
Re: SHChangeNotifyRegister + NT (W2k3) Dienst
Hallo.
Wollte nur kurz bescheid sagen: Habs dann jetzt doch ohne die Komponente gemacht, funktioniert aber trotzdem. Danke für alles, Imp |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz