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.