Service nt | tous ce que vous devez savoir | inclu doc, zip et source

Soyez le premier à donner votre avis sur cette source.

Vue 26 040 fois - Téléchargée 2 999 fois

Description

Un Service NT est une application win32 (windows) qui se lance automatiquement au demarrage de l'ordinateur sans se logguer à une session utilisateur.
Ce petit article va vous montrer comment créer, installer et configurer les services NT crées par Delphi. (pour winNT4/5 donc WinNT/2000/XP/2003...)
Pour commencer, il y'a 2 sortes de services NT:
1) ceux qui inter-réagissent (comuniquent) avec le bureau.
2)ceux qui sont transparents et n'affichent aucun message.
(PS: pour installer un service Delphi, utilisez la syntaxe via la ligne de commande: Projet1.exe /install et donc pour le désinstaller c'est /uninstall)
pour commencer, ouvrez delphi, choisissez nouveau, puis au lieu de choisir "Form", choisissez "Service Application".
ça va vous permettre de creer une application en tand que service (bien sure le service ne contient aucune form)
en compilant cette application, votre service est crée, mais le problème que tout le monde a, c'est le fait que le service ferme une fois il est executé par le service manager de winNT, et donc au lieu qu'il meurt, on va lui dire de rester vivant tand qu'il n'a pas reçu l'ordre de fermer:
L'astuce, c'est de mettre ce code (voir code #1 ci-dessous) dans le event OnExecute.
maintenant si vous compiler le service et vous l'installez, allez ds panneau de config, puis outils d'administration, puis services, et lancer votre service et vous verrez qu'il va rester vivant ;)
maintenant le servicé etant crée, on va faire quoi avec?
ben ce que vous voulez :)
le moyen le plus facile d'executer un code c'est de creer un timer, et de mettre votre code ds la partie OnTimer (que la valeur du timer soit minimum à 5000ms pour etre sure que le service est demarré... et qui est la valeur par defaut du service)

dans le zip j'ai mit la source d'une application service NT qui comunique avec le bureau et donc ouvre la calculatrice windows puis la referme puis la réouvre puis la referme avec un interval de 1sec entre chaque ouverture et fermeture ;)

Source / Exemple :


//CODE #1 (ASTUCE CRUCIALE)
procedure TService1.ServiceExecute(Sender: TService);
begin
 whilenot Terminated do
    ServiceThread.ProcessRequests(True); //attend l'ordre de fermeture
end;

Conclusion :


pour finir, qcq trucs à signaler concernant les proprietés d'un service sous Delphi:
(si vous installez le service par /install)
DisplayName => le nom que le service affichera dans le gestionnaire de service
Interactive => TRUE pour communiquer avec le bureau
Name => nom interne du service
ServiceType => WIN32 (pour application) DEVICE (pour peripherique) FILESYSTEM (pour systeme de fichier)
StartType => AUTO (pour demarrer automatiquement avec l'ordi)...

donc voila la base (le minimum) que vous etes censé connaitre pour la création d'un service NT fonctionel ;)

ça c'est mon 1er source sous DelphiFR, en esperant d'avoir le temps de poster autre chose...

PS: une fois le service fourni ds le zip est installé par /install vous le trouverez ds service manager sous le nom "DELPHI FR SERVICE"
Vous pouvez aussi utiliser /silent pour na pas afficher un message lors de l'install ou la désinstall du service ;)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
22
Date d'inscription
mardi 13 juillet 2004
Statut
Membre
Dernière intervention
3 septembre 2011

Ben oui mais, ça cours pas les rues comme dit Mauricio, j'ai bien un palliatif, mais c'est du bricolage.

d'ou cette exhumation .
Messages postés
13
Date d'inscription
samedi 8 février 2003
Statut
Membre
Dernière intervention
4 juillet 2012

Fichtre ! ca c'est du déterrage de topic ! :)
Messages postés
22
Date d'inscription
mardi 13 juillet 2004
Statut
Membre
Dernière intervention
3 septembre 2011

Bonjour a tous,

Je me suis inspiré de ton code pour creer un service qui envoie des mails. tout va bien quand je le teste sur mon poste (W7 Pro).
Par contre lorsque je l'installe sur un autre PC W7 Pro, là j'ai : Erreur 2 : le fichier spécifier est introuvable.

Je suis en train de chercher sur internet, mais pour le moment rien.

Si quelqu'un à une idée... Merci
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Arg, le tray icon n' apparait pas après reinicialsation du PC ...
Si quelqu' un connait la solution, je suis preneur!
A+
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut GaudeTM,

faut dire que les sources sur les services, ça court pas les rues!
Vu que j' en ai besoin pour un programme de mails qui importe les mails de plusieurs comptes (il marche en ce moment comme exe normal).

J' apporte un petit suplément à cette source, comment insérer un TrayIcon avec un PopMenu :

const
WM_TASKBAREVENT = WM_USER + 1;

type
TService1 = class(TService)
Timer1: TTimer;
Timer2: TTimer;
PopMenu: TPopupMenu;
MIMainWindow: TMenuItem;
MIPause: TMenuItem;
N1: TMenuItem;
MIClose: TMenuItem;
procedure ServiceExecute(Sender: TService);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
private
{ Private declarations }
procedure HandleIconMessage(var Msg: TMessage);
procedure WMTaskBarEvent(var Msg: TMessage); message WM_TASKBAREVENT;
public
FHandle: HWND; // On va créer un HWND juste pour capturer le click de la souris ...
IconData : TNotifyIconData;
function GetServiceController: TServiceController; override;
{ Public declarations }
end;

var
Service1: TService1;

procedure TService1.WMTaskBarEvent(var Msg: TMessage);
var pt: TPoint;
begin
if msg.LParam = WM_RBUTTONDOWN
then begin
GetCursorPos(pt);
PopMenu.Popup(pt.x, pt.y);
PostMessage(aHWND, WM_NULL, 0, 0);
end;
end;

procedure TService1.HandleIconMessage(var Msg: TMessage);
begin
if Msg.Msg = WM_TASKBAREVENT
then WMTaskBarEvent(Msg);
end;

procedure TService1.ServiceCreate(Sender: TObject);
begin
FHandle := Classes.AllocateHWnd(HandleIconMessage);

// Tray Icon :
IconData.cbSize := sizeof(IconData);
IconData.Wnd := FHandle;

IconData.uID := 100;
IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
IconData.uCallbackMessage := WM_TASKBAREVENT;
IconData.hIcon := Forms.Application.Icon.Handle;
StrPCopy(IconData.szTip, Service1.DisplayName);
Shell_NotifyIcon(NIM_ADD, @IconData);
end;

procedure TService1.ServiceDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @IconData);
Classes.DeallocateHWnd(FHandle);
end;

A+
Afficher les 50 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.