Delphi-PRAXiS

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)

Jan 31. Jan 2003 21:17


vcl-prog -> service
 
Hallo DP!

Ich habe keine Ahnung ob das hierher gehört, aber ich versuchs mal.
Undzwar möchte ich ein Programm schreiben, welches immer im Hintergrund läuft, also nie zu sehen ist, allen falls im Taskmanager.
Das Programm beinhaltet einen serversocket und soll nur auf eine message von aussen warten und dann in Aktion treten.
Das Programm soll also weder einen sichtbaren Form noch ein Trayicon haben. Weiterhin soll es bei jedem Windozestart getartet werden.
das Programm funktioniert schon, und tut das was es soll, allerdings weiss ich jetzt nicht wie ich es verstecken kann.
Ich hab dazu schon was von service gehört, aber das tut von Asserbad sagt mir extrem wenig, weil ich nicht verstehe was da gemacht wird. und ich keine Ahnung habe wie ich die vcl-komponenten (serversocket) da mitverwenden soll, da in seinem fertigen servicegerüst reiner pascal text ist, wie man ihn in ein pascalprog schreibt, aber das ist ganz anders als in Delphi. (heul) Ich glaube ihr merkt schon, ich bin vollkommen überfordert, und habe vielleicht nicht so ganz die Funktionsweise einer Delphiunit verstanden.
Könnte mir da einer helfen und sagen, wie ich mein fertiges Programm in dieses Servicegrundgerüst reinbekomme, und wie ich den service dann installiere, etc? ich hab da keinen blassen von.
Danke im Vorraus
Jan

Daniel B 31. Jan 2003 21:22

Hallo Jan,

vielleicht könntest Du uns mal ein direkten Link zur Verfügung stellen, dann kann man sich auch mal den Source anschauen. Sonst wird das nichts.
Eine fertige Unit bindet man ein, indem man sie ganz oben, bei den "uses" mit auflistet.

Grüsse, Daniel :hi:

Alexander 31. Jan 2003 22:03

also, du könntest das ganze als Anwendung in der TNA laufen lassen und einfach kein Icon setzen - allerdings weiß nicht genau, ob dann dort statt Icon Platz gelasse wird.
Du wirst es aber vermutlich nie hinbekommen deine Anwendung vor dem Taskmanager zu verstecken. Géht nur unter Win 9.x

Luckie 31. Jan 2003 22:20

Warum auch? :roll: Verstecken tun sich nur Viren.

Jan 31. Jan 2003 23:55

Hi DP,

@Daniel B: http://www.assarbad.org/stuff/tutori...svc/index.html hier ist das tut für die erstellung eines NT-service. Und da komme ich grad mal garnicht mit zurecht.

@alexander: Das hab ich ja garnicht vor, von miraus soll das Programm ruhig im Taskmanager zu sehen sein, allerdings soll es einfach so wenig auffällig wie möglich sein, da ich es auf meinem server benutzen will um bestimmte dinge von aussern zu steuern, dafür brauche ich auch den serversocket.

@Luckie: genau :cat:


Gruß
Jan

Alexander 1. Feb 2003 08:09

ok dann ich habe ich dich wohl nicht richtig verstanden

Jan 1. Feb 2003 16:33

Kann mir denn da jetzt jemand helfen?
Ich hab da extreme Probs und jedesmal wenn ich mich daran versuche bin ich kurz davor mit meinem Kopf in meinem Bildschirm zu schlagen.
Greetz
Jan

Luckie 1. Feb 2003 16:38

Ist bei den Delphi Enterprise Versionen kein Service-Grundgerüst dabei? Ich meine, ich hätte da mal was gesehen.

Salomon 1. Feb 2003 18:41

Hallo Jan,
um dein Programm zu verstecken muss du es nicht zwangsläufig als Services laufen lassen. Um das Haupfenster zu verstecken kannst du folgenden Code verwenden:
Code:
procedure TForm1.FormCreate(Sender: TObject);
var
  hwndOwner: HWnd;
begin
  hwndOwner := GetWindow(Handle, GW_OWNER);
  ShowWindow(hwndOwner, SW_HIDE);
  ShowWindowAsync(hwndOwner, SW_HIDE);
  ShowWindowAsync(Self.Handle, SW_HIDE);
end;
Falls du WinXP verwendest, ist dein Programm im Taskmanager nur noch unter Prozesse sichtbar, und wird nicht bei den ANwendungen aufgeführt.

Mfg

Jan 2. Feb 2003 02:51

Hallo Salomon,
also unter XP ist das schonmal erste Sahne, da funzt das echt toll, aber das Prog soll auch unter was anderem als xp laufen (ME und 2k) Wie sieht das da aus?
Macht das von der Sichtbarkeit einen Unterschied zu einem service unter win9x und NT?
BB!
Jan

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 08:03 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