begin process at 2010 02 10 12:58:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > SERVICE NT | TOUS CE QUE VOUS DEVEZ SAVOIR | INCLU DOC, ZIP ET SOURCE

SERVICE NT | TOUS CE QUE VOUS DEVEZ SAVOIR | INCLU DOC, ZIP ET SOURCE


 Information sur la source

Note :
9,45 / 10 - par 11 personnes
9,45 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Niveau :Initié Date de création :04/04/2004 Vu / téléchargé :19 001 / 2 569

Auteur : gaudetm

Ecrire un message privé
Site perso
Commentaire sur cette source (47)
Ajouter un commentaire et/ou une note

 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

  • //CODE #1 (ASTUCE CRUCIALE)
  • procedure TService1.ServiceExecute(Sender: TService);
  • begin
  • whilenot Terminated do
  • ServiceThread.ProcessRequests(True); //attend l'ordre de fermeture
  • end;
//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 ;)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip ANIMER UNE FORM (REDIMENTIONNEMENT) OUVERTURE/FERMETURE MENU...

 Sources de la même categorie

Source avec Zip Source avec une capture GLIBWMI VCL COMPONENT LIBRARY 1.6B par Neftali
Source avec Zip Source avec une capture UNITÉ DE SUPPORT VISTA par Bacterius
Source avec Zip Source avec une capture NETTOYEUR AUTOMATIQUE DE VOS DISQUES par diglas
Source avec Zip Source avec une capture LES VALUE'S FADERS par blueperfect
Source avec Zip Source avec une capture COUNTERS, UNITÉ DE CALCUL DE PERFORMANCE par Bacterius

Commentaires et avis

Commentaire de Delphiprog le 04/04/2004 10:54:14 administrateur CS

Félicitations pour ce premier article !
Voilà un sujet qui semble mystérieux pour beaucoup et que tu rends abordable avec une grande limpidité.

Que cet article soit le premier d'une longue lignée !
Merci beaucoup.

Commentaire de gaudetm le 05/04/2004 09:23:27

Merci à toi ;)
Je suis hyper occupé dans mon travail, et surtout que je travail en freelance pour la créations de site, donc mon temps est en or :)
si je travail, je vis pas lol
n'est-ce pas la vie est belle? lol

sinon j'ai une chose à rajoutter concernant le demarrage du service, au lieu d'aller ds le gestionnaire de service et de l'installer, on peut le faire via le shell de winNT (invite de commande).
donc il suffit d'utiliser la syntaxe suivante:
NET START "NOM DE VOTRE SERVICE"

pour arreter un service:
NET STOP "NOM DE VOTRE SERVICE"

dans le cas de la source que j'ai fourni, le service s'apelle:
"DELPHI FR SERVICE"
donc pour le demarrer:
NET START "DELPHI FR SERVICE"

voili voilou

Commentaire de ffert le 05/04/2004 21:53:16

Encore merci pour cette source trés pertinente....

Je la trouve claire et détaillée. J'ai  toutefois un petit bémol à rajouté car j'ai déjà réalisé des services.... Ils m'ont posé pas mal de problèmes. C'était sous Windows NT4. Le service tournait donc en permanence. Mais j'avais un problème de droits. Je lui demandais d'exécuter une action. Si   on étais loggé en admin : pas de problème, si l'on étais loggé en User : pas d'action !!!! Alors qu'on arrivait bien à lancer l'action manuellement sous les 2 log ????

Je pense qu'il y a un problème d'héritage des droits utilisateurs. Mais je ne suis pas arrivé à résoudre ce problème... Si quelqu'un connaît la solution... Si quelqu'un de compétent pouvais m'expliquer... ça me permettrait de me coucher moins bête ce soir...

Merci...
à+

Commentaire de gaudetm le 05/04/2004 23:30:35

@ ffert
ton problème est en qcq sorte classique, surtout sur les serveurs NT4.
en effet c'est un defaut dans l'heritage ds NT4, par contre comprehensible aussi, pour empecher l'execution de codes "malicieux" indirectement?
car à priori quand on est loggé en user, l'administrateur aurait établie au préalable la gestion de la sécurité locale, et donc si la sécurité des users a bien etait faite, un user normal ne pourrait pas lancer des actions qui touchent l'OS...

par defaut le service crée par Delphi, à son installation, s'attribue les droit du user SYSTEM (privilèges supérieurs à admin) et s'execute sous le user SYSTEM pour effectué ses taches (et donc a les droits absolues, meme pour detruire l'OS, que d'ailleur admin ne peut pas faire directement)

PS: le service Delphi peut etre configuré pour utiliser un nom d'utilisateur et un mot de passe pour son installation (voir proprietés du service)

maintenant concernant ton problème, essaye de le créer comme j'ai indiqué (je travail sour Delphi 7, et donc je ne sais pas si les version antérieurs possèdent les meme proprietés) et essaye d'executer tes actions.
je viens de tester sous XP et 2000 Advanced Server le meme service pour effectuer des actions sur le OS (install et désinstall d'un pilote système) et ça ne m'a pas causé de problème de droits ou de privilèges.
je n'ai pas NT d'installé pour tester, donc je ne pourrai pas prédire.
mais logiquement si sous NT le service demarre en tand que SYSTEM, je ne pense pas que l'OS refusera ces actions.

Cordialement,

Commentaire de Encore1ben le 17/04/2004 02:03:05

Salut,

Tout d'abord, Bravo car :
- ta source est extrêment bien expliquée
- et parce que le sujet est très très peu traité sur internet.

Mais voilà, j'ai quand même une peite question, j'ai tout bien compris, mais je n'arrive malheureusement pas à changer les options des services. Par exemple, avec un bouton, je lance un service en utilisant la commande "Net Start 'nom du service", mais je n'arrive pas à changer son 'starttype' pour le mettre par exemple en 'manuel'.. j'ai pourtant tout essayé, genre net start service /startype=auto, ou net /starttype=auto service... Bref, si tu pouvais m'aider ???

Sinon, Bravo et encore  Merci (allez un chtit Dix, parce que c vraiment du bon boulot!)

Commentaire de gaudetm le 17/04/2004 02:27:03

@ Encore1ben

c'est dans les proprietés du service qu'il faut changer:

StartType => AUTO/MANUAL... (pour demarrer automatiquement avec l'ordi)...

la proprieté StartType du Service sous delphi te permet de choisir le mode de demarrage lors de son installe ;)

voila

Commentaire de Encore1ben le 17/04/2004 02:56:48

vi vi, j'ai bien compris, amis j'ai du mal m'exprimer !
En fait, grâce à ta source, j'ai décidé de faire un chtit bout de programme (un exe) qui permet soit d'arrêter ou de démarrer le service d'affichage des messages (au lieu d'aller dans le panneau de config > outils d'admin> service>etc...) !! Mais voilà, quand la bécane, va rédémarrer le service va se relancer, donc il faut que je puisse passer le démarrage en manuel, et ce depuis mon ex (pour eviter que la personne le fasse de façon manuel) ! Donc, il faut que je le fasse par ligne de commande, comme je l'ai fais pour arrêter ou démarrer le service...

Je sais pas si je suis encore clair là ??? Ou alors, j'ai rien compris à ce que tu viens de me dire ?? (ce qui es fort possible aussi lol )

Merci pour ta réponse aussii rapide d'ailleurs ;)

Commentaire de gaudetm le 17/04/2004 05:29:48

pour le faire en manuel, suffit ds Delphi, de choisir ds la section Proprieté du service, StartType = MANUAL
tu le mets à MANUAL, et donc au redemarrage le service ne demarrera pas automatiquement (tout seul)
à ce moment là pour le demarrer fo faire NET START...
et pour le tuer c'est NET STOP...

voili voilou ;)

Commentaire de PascalZ le 01/06/2004 07:57:14

Salut,
Moi j'ai un probleme que j'ai du mal a résoudre avec un Service.
Mon service doit me lancer le client mail (outlook dans mon cas) mais il me le lance depuis le compte system, donc je n'ai pas les boites aux lettres de l'utilisateur de la session en cours :(
J'ai regardé du coté de CreateProcessAsUser pour lancer le client mail, mais il faut fournir le mot de passe ! Est ce qu'il y a un moyen d'executer un processus depuis un service avec l'utilisateur de la session en cours ?

Commentaire de gaudetm le 01/06/2004 20:29:05

@ PascalZ

ce né pa possible de le lancer avec l'utilisateur en cours, et ça pour des raisons de sécurité...

pour lancer un service Delphi avec un user et pass d'un compte NT, suffit de remplir les 2 champs proprietés du service:
"ServiceStartName" et "Password"

ds le 1er tu mets ".\Pascal"  (si Pascal est le user en question)
ds le 2nd le pass de Pascal

PS: sans les guillemets, et noublie pas le .\ qui signifie le user sur cet ordi et non pas sur un domaine...

Commentaire de aknoth le 09/09/2004 21:07:33

Bonjour! Merci pour les explications, l'astuce mentionnée dans l'exemple m'a permis de régler un problème. J'aurais cependant une question qui ne porte pas sur l'exemple mais sur les services en général.

J'ai une application serveur qui a été modifiée en service puisque nous voulons que notre serveur soit disponible en tout temps, même si l'utilisateur change de session sur l'ordinateur où le programme est installé.

Ça fonctionne bien tant qu'aucun client n'est connecté, mais dès qu'un client se connecte au serveur, on ne peut plus changer la session. Est-ce à cause des sockets? De la connexion à la base de données? Bref qu'est-ce qui peut empêcher la fermeture d'une session?

Commentaire de gaudetm le 09/09/2004 23:45:54

@aknoth

si j'ai bien comprit, windows bloque ou se met en attente à la fermeture de session...

à priori le probleme vient de ton application service (fo voir au nivo OnCloseQuery ça peut bloquer la fermeture du programe de là...)

puis verifies que ton service demarre en tand que SYSTEM et non pas un user normal de l'ordi

sinon fo regarder ds ton code (ça ne vient surrement pas des sockets car windows sait les fermer comme un grand ;)  )

Commentaire de aknoth le 13/09/2004 15:16:40

Merci pour ta réponse. Voici quelques précisions: le service démarre bien en tant que sytem et je n'ai aucun code dans OnCloseQuery. J'ai du code dans OnClose mais rien qui empêche la fermeture du programme.

La raison pour laquelle je demandais si ça pouvais être les sockets est que j'ai testé en créant seulement une connexion entre un client et mon serveur et ça bloque.

Les connexions entre le serveur et les clients ne doivent PAS être coupées. Alors je me disais peut-être que windows essais de fermer ces connexions alors qu'elles sont toujours actives...

J'ai remarqué que quand on quitte une session, OnCloseQuery est appelé deux fois. Lorsque je n'ai auncun client, windows ferme la session normalement. Si j'ai un client connecté, OnCloseQuery n'est appelé qu'une fois...

Merci pour ton aide encore une fois c'est très apprécié!

Commentaire de gaudetm le 13/09/2004 18:26:41

@aknoth

ben peut etre tout simplement le programe attend la fermeture des sockets (fo voir o nivo de ton code)

ça ne vient pas du service lui meme mais des composants INDY.
tu dois avoir des fonctions thread pour le TCP, et essaye de forcer la fermeture des connections manuellement

à part ça je ne suis pas dans ton code, donc je suis celui qui est le moin qualifié à te répondre ;)

Commentaire de Deufr le 28/10/2004 18:30:18

Heu... ça compile pas... manque svcmgr.dcu

Ne me dites pas que ces rats de chez Borland on viré ça de l'edition perso ?

Commentaire de gaudetm le 29/10/2004 00:00:02

@ Deufr

je ne suis pas certain que la version perso de Delphi a le support Services NT...

et ce n'est pas des rats chez Borland, ils estiment tout simplement que la personne ayant la version perso n'est pas un developpeur professionel, et donc la création de Services NT n'est pas censé etre à sa portée.

biensure, le sens de "developpeur professionel" ne veut en aucun cas dire que la personne est incompetente, mais plutot que la personne ne fait pas partie qu'une societé (et donc n'est pas censé avoir le besoin de creer des Services NT, car ce genre d'applications sont reservées aux logiciels à utilisation spécifique et orientées entreprises...)

Commentaire de Deufr le 29/10/2004 00:15:44

Ben ouai mais si je suis "competent" et que je veux ecrire un freeware utilisant un service, j'ai pas le droit à Delphi ?

Bon... si une âme charitable peut m'envoyer le .pas et le .dcu ça me ferait bien plaisir (demander mon mail en perso)

Commentaire de gaudetm le 01/11/2004 21:26:34

@Deufr

biensure que tu peux
t'achetes la version pro ou entreprise de Delphi ;)

Commentaire de Deufr le 01/11/2004 22:48:05

:p

Commentaire de wismerhill40 le 14/12/2004 16:09:30

je viens de lire tout ce qui est ecrit sur cette page et moi j'ai autre probleme (comme beaucoup d'autre je pense) a savoir que lorsque j'arrete ma machine j'ai un message d'erreur du type
"nom_du_service" erreur d'application  exception logiciel inconnue blablabla 0x77e7e592".
sachant que dans mon service j'ai un client TCP. J'ai essaye de voir avec l'appartenance au groupe tcp mais ca ne change rien. Je me demande si le service ne s'arrete pas apres le service TCP. Mais jai essaye de l'arrete avant. Soit il s'arrete avant mais cela n'a rien change, soit il s'arrete toujours quand il veut. Si quelqu'un a une solution quelquonque cela m'aiderai car ca fait 6 mois que je suis dessus sans rien regler !!!
Pitier ...

Commentaire de gaudetm le 14/12/2004 22:01:22

@wismerhill40

peut etre c'est à cause des sockets...
je ne connais pas ce code d'erreur donc je ne pourrai pas te dire

sinon verifie bien que tes connections sont fermées avant que le service se termine
et si t'utilise un accès base de donnée, deconnecte toi de la base à l'avance...

enfin, fo faire des tests quoi

Commentaire de falves le 09/01/2005 12:04:31

Hello,

Super, ça marche très bien.
Quelqu'un sait-il comment, via un service, obtenir, sous XP :
* Le nom de la session en cours ?
* l'évenement d'ouverture de session ?
* l'évenement d'ouverture de session ?

merci d'avance.

Commentaire de cdetre le 08/04/2005 17:07:32

Bonjour à tous,

Grace à ce source, j'ai enfin compris quelque chose aux services sous Delphi, merci.
Je cherche à developper un service qui permettrait de scruter un repertoire, de detecter la présence de fichiers dans ce repertoire et de les envoyer par mail.
Je comptais utliser un Tfilelistbox mais cenu-ci ne sont pas admis dans un TService.
Comment faire ? Quel composant utiliser ?

Merci d'avance
Christophe

Commentaire de gaudetm le 09/04/2005 12:05:12

@cdetre

ya pa de koi

concernant ta question, avant toute chose, le service doit demarrer avec les droits asequats pour kil puisse naviguer sur un systeme de fichier NTFS.
l'ideal c'est de demarrer le service avec les droits system.
pour le composant, utilise plutot un listarray ou un array carremen
je ne t'aiderai pa d'avantage car j'ai l'impression ke ton service a un but pa trop amical...

@++

Commentaire de cdetre le 09/04/2005 15:05:40

Je te rassure tout de suite, ce n'est pas un service de flicage ou quoi que ce soit d'autre, mais bien une aide aux utilisateurs du reseau que je souhaite mettre en place. J'explique,

Il s'agit d'envoyer par mail des fichiers PDF fabriqués par les utilisateurs, pour le moment ils doivent les envoyer eux mêmes après les avoir fabriqué, ils se trompent régulièrement dans les adresses ou en oublient. A présent ils suffira de les copier dans un dossier pour qu'ils soient traités correctement.

Pour résoudre mon souci, j'ai utilisé un array comme tu le préconisais, ça fonctionne.
Merci

Commentaire de Didier44 le 12/07/2005 14:30:54

Bonjour,
Tout d'abord félicitation pour cet exemple qui a le mérite de nous  mettre rapidement le pied à l'étrier dans l'apprentissage et la manipulation d'une application service. Je rencontre toutefois une difficulté lorsque j'essaie dans cette application d'accéder à une base Interbase , je m'explique:
Dans l'application Service j'ai programmé une interruption toutes les 3 secondes dans laquelle je déclenche un bip me permettant de vérifier que mon appli tourne ; dans cette interruption j'ouvre une table et je la referme aussi sec ; j'ai donc utilisé un composant TDataBase et TTable ; je me connecte à ma database apres l'install de l'application service . Que se passe-t-il ? lors de l'installation de l'appli (appli /install) celle-ci tourne normalement jusqu'à ce que je valide par Ok ; ensuite je fait dans la gestion des service et je démarre mon service et la tout se passe normalement , j'obtiens un bip et puis plus rien alors que je devrai retrouver ce bip toutes les 3 secondes ?WHYYYYY ; j'ajoute que si j'arrete ce service cela répons apparemment correctement el lorsque je desinstalle l'appli se met à refonctionner normalement jusqu'à ce que j'appuie sur la touche OK

Commentaire de gaudetm le 13/07/2005 09:02:27

@Didier44

verifie que ton application service:
Interactive => TRUE pour communiquer avec le bureau

je pense ke ton probleme vient de la

Commentaire de Didier44 le 13/07/2005 19:45:27

Encore merci GAUDETM de m'accorder un peu de temps
mais je n'arrive décidément pas à me connecter à une database dans mon application service
J'ai essayé de passer la propriété interactive à true et cela n'a rien changé; tout se passe comme si la base n"était pas ouverte et pourtant je l'ai effectué dans la routine afterinstall (j'ai également essayé beforeinstall sans résultart)

Commentaire de gaudetm le 14/07/2005 09:40:47

@Didier44

ben je dirai qu'il y'a un probleme dans ton code...
essaye avec une application normale pour voir, si le probleme perciste revois ton code

Commentaire de Didier44 le 19/07/2005 20:31:59

bonjour ,
je n'arrive toujours pas à trouver ma solution pour l'utilisation d'une database dans une apllication service ;est-ce que tu peux jeter un coup d'oeil sur mon micro-projet; je sais qiue ton temps est compté mais là vraiment je craque et ne voit pas d'issue ; j'ai essayé de contacter team-b qui me mène en bateau (avez-vous essayé ceci,cela et au bout du compte je n'avance pas).le projet est vraiment très très court (je tente d'ouvrir un composant TDataBase dasn l'instruction onstart du Tservice ,j'ajoute que je manipule les composants TdataBase depouis pas mal de temps et n'ai jamis rencontré ce type de problème.

Commentaire de Didier44 le 20/07/2005 18:43:48

j'ai repris ton projet et ai simplemnt ajourté un objet TDatabase sur la fiche Tservice et dans ton instruction j'ai rajouté l'instruction:
DataBase1.Connected:=true;
Et là j'obtiens l'erreur 1067(le processus s'est arreté inopinément: en fait il n'arrive pas à "ouvrir" la base) lorsque je lance le Service !! Le code ne peut pas être plus court mais je ne comprends pas pourquoi j'obtiens cette erreur
L'objet TDataBase pointe sur une base interbase (version 7.5) en monoposte ; la propriété connecte est à false en conception (j'ai essayé de la passer à true pour vérifier le bon parametrage de mon Objet.)

Commentaire de gaudetm le 21/07/2005 09:07:03

@Didier44

mettre ton code dans OnStart peut causer des problemes avec un service...
regarde bien mon code, tu verras que le 1er timer commence a s'executer apres 3 secondes du demarrage du service (pour etre sure que le service a demarré)
essaye de faire pareil. faut bidouiller, car la tu ne travailles pas dans une application win32 normale!

tu poses trop de questions sans vouloir savoir le pourquoi, tu veux juste savoir le comment.
je te conseil de documenter et de savoir comment windows fonctionne, t'auras toutes les reponses que tu cherches.
je ne pense pas etre un pro windows, donc je ne me permet pas de t'expliquer.
du coup, pourquoi mon code fonctionne et pas le tient?

perso j'ai reussi a me connecter a des bases externes et des bases via ODBC, et jamais eu de probleme.

Commentaire de gaudetm le 21/07/2005 09:10:14

@Didier44

encore une chose, pour te faciliter la vie, cree un programme win32 et execute dedans ce ke tu veux, puis une application service qui demarrera ton application principale en arriere plan, beaucoup de programmes fonctionnent de cette facon.

Commentaire de askil2000 le 08/09/2005 16:22:04

Salut tout le monde !
Merci GAUDETM pour ta source et ton explication :o)
c'est tout simplement génial. Petite question au sujet du service toujours, est t'il possible de mettre une description ?

Car tu dis comment changer le Nom, le StartType, mais pas la Description. Et j'avoue avoir cherché dans l'appli, puis sur le net, à croire que c'est toi qui a inventé le service windows. Je t'implore oohhh grand GAUDETM livre nous le secret de ton savoir lol. Et encore merci ....

Commentaire de PascalZ le 08/09/2005 16:33:19

salut,

moi pour la description, je la change directement dans la base de registre :

Reg := TRegIniFile.Create;
try
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  Reg.OpenKey('SYSTEM\CurrentControlSet\Services',False);
  Reg.WriteString('LE_NOM_DE_MON_SERVICE','Description','la description de mon service');
  Reg.CloseKey;
finally
  FreeAndNil(Reg);
end;

Commentaire de askil2000 le 08/09/2005 16:48:16

nikel, merci PascalZ !

Commentaire de Didier44 le 17/10/2005 16:42:47

Bonjour à tous,
après un break de quelques mois je reprends mon projet de transformer mon apllication classique en service windows xp(je travaille avec c++Builder 5 pro ou delphi 5 et Interbase 6.0 monoposte);j'ai donc repris texto ton projet qui fonctionne parfaitement ; maintenant j'ai rajouté un composant TDatabase sur la fiche et rallongé la tempo avant la fermeture du programme calculatrice (j'ai mis 10s) dans le timer 1 je me connecte à la Base (connected->true) puis me déconnecte dans le timer 2 :lorsque mon composant tdatabse pointe sur une table paradox je n'ai pas de soucis, en revanche lorsqu'il pointe sur une table interbase cela plante ; je ne comprends vraiment pas pourquoi (mon mot de passe et identifiant sont évidemment valides et j'ai mis loginprompt à false) en mode conception je me connecte et déconnecte normalement : aurais-tu une petite idée,un début d'explication,une adresse,un lien qui me permette de comprendre ce phénomène.

Commentaire de Didier44 le 19/10/2005 16:35:24

J'ai enfin trouvé l'explication : je ne pouvais tout simplement pas accéder à ma base de données (Interbase) dans mon apllication service parceque le serveur Interbase éatit lancé comme apllication standard et non comme service (Je ne peux dire pourquoi cela ne fonctionnait pas ; en revanche je sais que depuis que je l'ai lancé en tant que service je n'ai plus aucun pb!) Peut-être auras-tu une explication
Merci encore pour ton exemple qui m'a permis de m'appuyer sur quelque chose d'éprouvé et qui m'a permis de faire des tests par ailleurs.

Commentaire de gaudetm le 20/10/2005 12:03:08

@Didier44

je pense que ton probleme etait un probleme d'authorisation (droits d'utilisateur) et/ou de securité (parfeu)
ca fait quelques mois que t'as ce probleme, t'aurais due bien regarder en dehors de ton service ;)

en tout cas, ta remarque est bonne a savoir, et surtout cruciale a eviter :)

merci

Commentaire de thierrylp le 21/10/2005 02:18:33

Bonjour,
Je developpe egalement un service Delphi permettant de scruter un trigger sur un Bdd Firebird 1.5 (projet Phoenix basé sur interbase 6.0).
lors du lancement de mon service j'ai une erreur qui se produit : Erreur 193 0xC1
J'ai respecté les recommandations en lancant cette connection bdd au bout de 5 s.
Rien n'y fait , je dois passer à coté de qq chose.
Merci pour toute info.

Commentaire de thierrylp le 27/10/2005 04:53:20

Trouvé l'explication, je la donne cela peut toujours servir.
Pour installer un service, on doit se situer dans le repertoire de l'executable et en ligne de commande taper : MonAppliService.exe /install
Si l'on se trouve dans un repertoire interne de mes documents <---ca marche pas et il se produit l'erreur citée plus haut.
A bon entendeur...

Commentaire de thierrylp le 27/10/2005 05:27:02

La suite...
maintenant mon service se lance, la connexion à la bdd se fait correctement.
mon service recoit les evenements postés par la bdd firebird.
Sur un evenement je desire lancer un executable developpé en delphi (aussi).
J'utilise la mm commande que dans la source ci dessus.:
WinExec(PChar('C:\Program Files\Micap\Administration\miAdmin.exe'), SW_SHOWNORMAL);
Lors du lancement de cette ligne de commande j'ai un message d'erreur Unnamed:
----------------------------------------------------------------------------------
C:/Documents and Setting\LocalService\Bureau fait référence à un emplacement non disponible. Il peut s'agir d'un emplacement situé sur un disque dur de cet ordinateur ou sur un reseau. Vérifier que le disque est insérer correctement, ou que vous êtes connecté(e) à Internet ou à un réseau domestique, puis essayer à nouveau. Si vous ne trouvez toujours pas l'information, elle a peut être été déplacée vers un emplacement différent.
--------------------------------------------------------------------------------------
Désolé pour la longueur. Une fois le message acquité, mon executable est lancé mais cé bien dommage pour une application qui doit se gerer sans intervenant.
Des suggestions ? elles seront bienvenues.

Commentaire de gaudetm le 27/10/2005 11:42:50

@thierrylp

c'est normal
que ca soit plutot avec des guillemets:
PChar('"C:\Program Files\Micap\Administration\miAdmin.exe"')

car dans "Program Files" il ya d'espace...
assez clair je pense ;)

Commentaire de raimbow64 le 19/11/2005 12:36:28

Bonjour, merci pour ces informations. Une question peut on gerer les execptions ?
car j'ai essayé de faire ceci (qui fonctionne dans une appli normale)
dans le oncreate j'ajoute
application.onexception := mafonctionaexecuter;
mais lors de la compilation il me dit que onexception est un identificateur non déclaré. Je ne vois d'où cela peut provenir.

Commentaire de MikoLePepe le 15/04/2006 14:33:01

Très clair et hautement utile....
Merci!!!

Commentaire de MAURICIO le 10/01/2008 18:49:40

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+

Commentaire de MAURICIO le 10/01/2008 19:01:40

Arg, le tray icon n' apparait pas après reinicialsation du PC ...
Si quelqu' un connait la solution, je suis preneur!
A+

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales