Ist das nicht die Funktion zum Verstecken eines Programms unter Windows 9x vor dem Taskmanager? In dem Fall wäre wohl eine Implementierung als Form-bezogene Funktion völlig daneben?!
Hier dürfte die Fehlermeldung wohl eher damit zu tun haben, dass das Programm nicht "weiß", dass das eine Systemfunktion ist, die nicht im Unitcode geschrieben werden muss.
Lösung -
Variante #1, gefunden in der Sparte
Sonstiges, von bis11:
Quelltext
1: 2:
| function RegisterServiceProcess(dwProcessId,dwType: dword):Integer;stdcall; external 'kernel32.dll'; |
Vorteil: ist einfacher; Nachteil: unter NT-Systemen gibt es eine unschöne Fehlermeldung.
Variante #2, die dynamische Methode:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| type TRegisterServiceProcess = function(dwProcessId,dwType: dword): integer; stdcall; var RegisterServiceProcess : TRegisterServiceProcess; dll : THandle = 0;
{ ... }
initialization if(Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then begin dll := LoadLibrary('kernel32.dll'); if(dll <> 0) then begin RegisterServiceProcess := GetProcAddress(dll,'RegisterServiceProcess'); if(@RegisterServiceProcess = nil) then begin FreeLibrary(dll); dll := 0; end; end; end; finalization if(dll <> 0) then FreeLibrary(dll); end; |
Vorteil: keine Fehlermeldung; Nachteil: ein bisschen mehr Schreibarbeit
und vor der Benutzung muss kontrolliert werden, ob die Funktion überhaupt zugewiesen wurde, da das z.B. unter NT, 2000 und XP eben nicht der Fall ist:
Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.FormCreate(Sender: TObject); begin if(@RegisterServiceProcess <> nil) then RegisterServiceProcess(0,1); end; |