Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi vcl-prog -> service (https://www.delphipraxis.net/2665-vcl-prog-service.html)

Daniel B 2. Feb 2003 11:06

Morgäähn...

also bei mir geht der Code. Unter ME!
Allerdings lässt sich das Programm mehrmals starten, in der Lib gibt es Beispiele wie sich das verhindern lässt. Suche benutzen mit "Mutex" und "mHandle".

Grüsse, Daniel :hi:

Salomon 2. Feb 2003 13:51

Ich denke das du den Code unter allen Windowsversionen (9x und NT) nutzen kannst, da nichts Systemspezifisches verwendet wir. Getestet habe ich es aber nur unter XP.
Unter Win 9x kannst du dein Programm sogar vor dem Taskmanager verstecken. Der Code ist so geschrieben, das er unter XP keine Fehlermeldung ausgibt:
Code:
type TRegisterServiceProcess = function(dwProcessID,dwType: DWord) : DWord; stdcall;
     var RegisterServiceProcess: TRegisterServiceProcess;
         hKernel32: HInst;
Das hier in's Form Create:
Code:
{Hide Server from TaskList on Win9x}
hKernel32 := LoadLibrary('Kernel32.dll');
if hKernel32 <> HInst(nil) then
     RegisterServiceProcess :=  GetProcAddress(hKernel32,'RegisterServiceProcess');
if Assigned(RegisterServiceProcess) then
     RegisterServiceProcess(GetCurrentProcessID,1);
Mfg
Salomon

Jan 2. Feb 2003 14:01

Sehr n1, thx 2 Salomon.
Jetzt muss ich nurnoch verstehen, was das macht, dann bin ich glücklich. :dance:
ich bin dann mal wieder proggen, cu!
:coder:

Christian Seehase 2. Feb 2003 15:25

Moin Jan,

Salomon importiert damit dynamisch eine Funktion aus der Kernel32.dll von 9x/ME, nämlich RegisterServiceProcess.

Diese Funktion simuliert unter 9x/ME, dass ein Prozess ein Service ist.
Simuliert, da diese Betriebssysteme keine Services kennen.
Der Prozess wird nur vor dem Taskmanager versteckt, damit man ihn nicht über den Taskmanager abschiessen kann.

LoadLibrary lädt die angegebene DLL in den Adressraum des diese Funktion aufrufenden Prozesses. War die DLL schon geladen, wird intern ein Referenzzähler erhöht.
Im Falle der Kernel32.dll sollte man sich das Laden allerdings sparen können, da sie immer zu jedem Prozess dazugeladen wird. Ansonsten wäre es auch etwas schwierig LoadLibrary aufzurufen, da diese Funktion von der Kernel32 zur Verfügung gestellt wird.

Ist der Rückgabewert von LoadLibrary ungleich 0, enthält hKernel32 ein Handle auf die DLL.

GetProcAddress liest nun die Adresse der angegebenen Funktion (2. Parameter) aus dem Modul, dessen Handle angegeben wurde (1. Parameter).
(Wichtig: Die Gross-/Kleinschreibung des Funktionsnamens muss eingehalten werden)

Ist hier der Rückgabewert ungleich Null (da Pointer hier mittels Assign überprüft), wurde die Funktion gefunden und deren Adresse zurückgegeben.

Wenn alles gut gelaufen ist wird nun RegisterServiceProzess aufgerufen.
Der erste Parameter muss die ID des Prozesses sein, der bearbeitet werden soll. Der zweite Parameter entscheidet dann, ob der Prozess als Service angesehen werden soll (1) oder nicht (0).
Hier natürlich 1.

Da die Funktion unter NT ff nicht existiert, hier gibt's ja echte Services, würde GetProcAddress fehlschlagen, und null zurückliefern, so dass die Funktion RegisterServiceProcess nicht aufgerufen würde.

In aktuellen Versionen des PSDK ist RegisterServiceProcess nicht mehr dokumentiert :?

(beim googeln hab' ich mal eine Seite des MSDN gefunden, wo die Funktion dokumentiert ist. Leider reicht mein japanisch dafür allerdings nicht ;-) )

@Salomon:
Es fehlt eigentlich nur noch die Freigabe der Kernel32.


Im FormDestroy muss noch

Delphi-Quellcode:
if hKernel32 <> HInst(nil) then
begin
  FreeLibrary(hKernel32);
end;
nachgetragen werden.

Jan 2. Feb 2003 15:43

Und wieder bin ich um einiges weiser und belesener geworden, dank Christian :dancer2: Danke für die ausführliche Erklärung.
Gruß
Jan

Salomon 2. Feb 2003 17:29

@Christian Seehase: Gut erklärt :) Das Freigeben der DLL habe ich wohl vergessen, da ich den Code aus einem älteren Projekt kopiert hatte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.
Seite 2 von 2     12   

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