begin process at 2010 02 10 09:26:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > GERER LES SERVICES DE WINDOWS AVEC WINSVC

GERER LES SERVICES DE WINDOWS AVEC WINSVC


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :api, winsvc, openscmanager, createservice, serviceopen Niveau :Initié Date de création :21/11/2006 Date de mise à jour :21/11/2006 16:36:52 Vu / téléchargé :7 322 / 917

Auteur : elguevel

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

 Description

Cliquez pour voir la capture en taille normale
Ce matin par MP quelqu'un m'a demandé comment contrôler les services de Windows.
Voilà donc un petit exemple "très succint" de certaines fonctionalités de la librairie WinSVC, fourni avec Delphi. Cette librairie  permet d'accéder à différentes API Windows permettant la gestion des services Windows.

Possibilité dans cette source de définir une application comme service.
Detruire un service.
Démarrer et arreter un service.

Et tous ceci sur une machine distante si vous le souhaitez.

Source

  • {
  • *----------------------------------------------*
  • Exemple d'utilisation de la librairie WinSVC
  • et des services Windows.
  • Par LEVEUGLE Damien (c) 2006
  • Pour Code-Source / DelphiFr.Com
  • *----------------------------------------------*
  • Unité à complété et à finir !
  • }
  • unit ElgServiceNT;
  • {.DATA}
  • interface
  • uses Windows, WinSVC;
  • function ServiceCreate( SrvName : string; Libelle : string; Chemin : string; Machine : string = '' ) : Boolean;
  • // function ServiceOpen( SrvName : string; Machine : string = '' ) : Cardinal;
  • function ServiceRemove( SrvName : string; Machine : string = '' ) : Boolean;
  • function ServiceStart ( SrvName : string; Machine : string = '' ) : Boolean;
  • function ServiceStop ( SrvName : string; Machine : string = '' ) : Boolean;
  • function ServiceState ( SrvName : string; Machine : string = '' ) : string;
  • {.CODE}
  • implementation
  • { Ouvre un service }
  • function ServiceOpen( SrvName : string; Machine : string = '' ) : Cardinal;
  • var
  • H_SC : SC_Handle;
  • begin
  • if ( Machine = '' ) then
  • H_SC := OpenSCManager( nil, nil, SC_MANAGER_ALL_ACCESS )
  • else
  • H_SC := OpenSCManager( PChar( Machine ), nil, SC_MANAGER_ALL_ACCESS );
  • Result := OpenService( H_SC,
  • PChar( SrvName ),
  • SC_MANAGER_ALL_ACCESS );
  • end;
  • { Créé un service }
  • function ServiceCreate( SrvName : string; Libelle : string; Chemin : string; Machine : string = '' ) : Boolean;
  • var
  • H_SC : SC_Handle;
  • H_Sr : SC_Handle;
  • begin
  • Result := False;
  • H_SC := ServiceOpen( SrvName, Machine );
  • if ( H_SC > 0 ) then
  • begin
  • H_Sr := CreateService( H_SC,
  • PChar( SrvName ),
  • PChar( Libelle ),
  • SC_MANAGER_ALL_ACCESS,
  • SERVICE_WIN32_OWN_PROCESS,
  • SERVICE_AUTO_START,
  • SERVICE_ERROR_IGNORE,
  • PChar( Chemin ),
  • nil,
  • nil,
  • nil,
  • nil,
  • nil );
  • if ( H_Sr > 0 ) then
  • Result := True
  • else
  • begin
  • MessageBoxA( 0, PChar( 'Une erreur c''est produite à la création du service' ), PChar('Erreur'), MB_ICONWARNING );
  • Result := False
  • end;
  • CloseServiceHandle(H_Sr);
  • CloseServiceHandle(H_SC);
  • end;
  • end;
  • { Supprime un service }
  • function ServiceRemove( SrvName : string; Machine : string = '' ) : Boolean;
  • var
  • SrvHandle : Cardinal;
  • begin
  • Result := False;
  • SrvHandle := ServiceOpen( SrvName, Machine );
  • try
  • Result := DeleteService( SrvHandle );
  • finally
  • CloseServiceHandle( SrvHandle );
  • end;
  • end;
  • { Démarre un service }
  • function ServiceStart( SrvName : string; Machine : string = '' ) : Boolean;
  • var
  • SrvHandle : Cardinal;
  • ServiceArgVectors : PAnsiChar;
  • SrvState : _SERVICE_STATUS;
  • begin
  • Result := False;
  • ServiceArgVectors := nil;
  • SrvHandle := ServiceOpen( SrvName, Machine );
  • try
  • Result := ( StartService( SrvHandle, 0, ServiceArgVectors ) );
  • finally
  • CloseServiceHandle( SrvHandle );
  • end;
  • end;
  • { Arrête un service }
  • function ServiceStop( SrvName : string; Machine : string = '' ) : Boolean;
  • var
  • SrvHandle : Cardinal;
  • ServiceArgVectors : PAnsiChar;
  • SrvState : _SERVICE_STATUS;
  • begin
  • Result := False;
  • ServiceArgVectors := nil;
  • SrvHandle := ServiceOpen( SrvName, Machine );
  • try
  • Result := ControlService( SrvHandle, SERVICE_CONTROL_STOP, SrvState );
  • (*
  • Si çà vous interesse, les différents autres status sont :
  • - SERVICE_CONTROL_STOP
  • - SERVICE_CONTROL_PAUSE
  • - SERVICE_CONTROL_CONTINUE
  • - SERVICE_CONTROL_INTERROGATE
  • - SERVICE_CONTROL_SHUTDOWN
  • *)
  • finally
  • CloseServiceHandle( SrvHandle );
  • end;
  • end;
  • { Renvoi l'etat actuel du service }
  • function ServiceState( SrvName : string; Machine : string = '' ) : string;
  • var
  • SrvHandle : Cardinal;
  • SrvState : _SERVICE_STATUS;
  • begin
  • SrvHandle := ServiceOpen( SrvName, Machine );
  • try
  • if not ( QueryServiceStatus( SrvHandle, SrvState ) ) then
  • Result := 'Le service est inexistant !'
  • else
  • begin
  • case ( SrvState.dwCurrentState ) of
  • SERVICE_CONTINUE_PENDING : Result := 'Le service est en train d''être relancé après une opération continue';
  • SERVICE_PAUSE_PENDING : Result := 'le service est en train d''être relancé après une opération pause';
  • SERVICE_PAUSED : Result := 'Le service est en pause';
  • SERVICE_RUNNING : Result := 'Le service est démarré';
  • SERVICE_START_PENDING : Result := 'Le service est en cours de démarrage';
  • SERVICE_STOP_PENDING : Result := 'Le service est en cours d''arrêt';
  • SERVICE_STOPPED : Result := 'Le service est stoppé';
  • else
  • Result := 'Etat du service inconnu ou service inexistant !';
  • end;
  • end;
  • finally
  • CloseServiceHandle( SrvHandle );
  • end;
  • end;
  • end.
{
  *----------------------------------------------*
    Exemple d'utilisation de la librairie WinSVC
    et des services Windows.

    Par LEVEUGLE Damien (c) 2006
    Pour Code-Source / DelphiFr.Com
 *----------------------------------------------*

 Unité à complété et à finir  !

}

unit ElgServiceNT;

{.DATA}
interface

uses Windows, WinSVC;

   function ServiceCreate( SrvName : string; Libelle : string; Chemin : string; Machine : string = '' ) : Boolean;
// function ServiceOpen( SrvName : string; Machine : string = '' ) : Cardinal;
   function ServiceRemove( SrvName : string; Machine : string = '' ) : Boolean;
   function ServiceStart ( SrvName : string; Machine : string = '' ) : Boolean;
   function ServiceStop  ( SrvName : string; Machine : string = '' ) : Boolean;
   function ServiceState ( SrvName : string; Machine : string = '' ) : string;

{.CODE}
implementation


{ Ouvre un service }
function ServiceOpen( SrvName : string; Machine : string = '' ) : Cardinal;
var
  H_SC : SC_Handle;
begin
  if ( Machine = '' ) then
    H_SC := OpenSCManager( nil, nil, SC_MANAGER_ALL_ACCESS )
  else
    H_SC := OpenSCManager( PChar( Machine ), nil, SC_MANAGER_ALL_ACCESS );

  Result := OpenService( H_SC,
                         PChar( SrvName ),
                         SC_MANAGER_ALL_ACCESS );
end;



{ Créé un service }
function ServiceCreate( SrvName : string; Libelle : string; Chemin : string; Machine : string = '' ) : Boolean;
var
  H_SC : SC_Handle;
  H_Sr : SC_Handle;
begin
  Result := False;

  H_SC := ServiceOpen( SrvName, Machine );

  if ( H_SC > 0 ) then
  begin
    H_Sr := CreateService( H_SC,
                           PChar( SrvName ),
                           PChar( Libelle ),
                           SC_MANAGER_ALL_ACCESS,
                           SERVICE_WIN32_OWN_PROCESS,
                           SERVICE_AUTO_START,
                           SERVICE_ERROR_IGNORE,
                           PChar( Chemin ),
                           nil,
                           nil,
                           nil,
                           nil,
                           nil );
    if ( H_Sr > 0 ) then
      Result := True
    else
    begin
      MessageBoxA( 0, PChar( 'Une erreur c''est produite à la création du service' ), PChar('Erreur'), MB_ICONWARNING );
      Result := False
    end;

    CloseServiceHandle(H_Sr);
    CloseServiceHandle(H_SC);

  end;
  
end;



{ Supprime un service }
function ServiceRemove( SrvName : string; Machine : string = '' ) : Boolean;
var
  SrvHandle : Cardinal;
begin
  Result := False;
  SrvHandle := ServiceOpen( SrvName, Machine );
  try
    Result := DeleteService( SrvHandle );
  finally
    CloseServiceHandle( SrvHandle );
  end;
end;



{ Démarre un service }
function ServiceStart( SrvName : string; Machine : string = '' ) : Boolean;
var
  SrvHandle : Cardinal;
  ServiceArgVectors : PAnsiChar;
  SrvState  : _SERVICE_STATUS;
begin
  Result := False;
  ServiceArgVectors := nil;
  SrvHandle := ServiceOpen( SrvName, Machine );
  try
    Result := ( StartService( SrvHandle, 0, ServiceArgVectors ) );
  finally
    CloseServiceHandle( SrvHandle );
  end;
end;



{ Arrête un service }
function ServiceStop( SrvName : string; Machine : string = '' ) : Boolean;
var
  SrvHandle : Cardinal;
  ServiceArgVectors : PAnsiChar;
  SrvState  : _SERVICE_STATUS;
begin
  Result := False;
  ServiceArgVectors := nil;
  SrvHandle := ServiceOpen( SrvName, Machine );
  try
    Result := ControlService( SrvHandle, SERVICE_CONTROL_STOP, SrvState );

    (*
        Si çà vous interesse, les différents autres status sont :
        - SERVICE_CONTROL_STOP
        - SERVICE_CONTROL_PAUSE
        - SERVICE_CONTROL_CONTINUE
        - SERVICE_CONTROL_INTERROGATE
        - SERVICE_CONTROL_SHUTDOWN
    *)

  finally
    CloseServiceHandle( SrvHandle );
  end;
end;



{ Renvoi l'etat actuel du service }
function ServiceState( SrvName : string; Machine : string = '' ) : string;
var
 SrvHandle : Cardinal;
 SrvState  : _SERVICE_STATUS;
begin
  SrvHandle := ServiceOpen( SrvName, Machine );
  try
  
    if not ( QueryServiceStatus( SrvHandle, SrvState ) ) then
      Result := 'Le service est inexistant !'
    else
    begin

      case ( SrvState.dwCurrentState ) of
        SERVICE_CONTINUE_PENDING : Result := 'Le service est en train d''être relancé après une opération continue';
        SERVICE_PAUSE_PENDING    : Result := 'le service est en train d''être relancé après une opération pause';
        SERVICE_PAUSED           : Result := 'Le service est en pause';
        SERVICE_RUNNING          : Result := 'Le service est démarré';
        SERVICE_START_PENDING    : Result := 'Le service est en cours de démarrage';
        SERVICE_STOP_PENDING     : Result := 'Le service est en cours d''arrêt';
        SERVICE_STOPPED          : Result := 'Le service est stoppé';
      else
          Result := 'Etat du service inconnu ou service inexistant !';
      end;

    end;

  finally
    CloseServiceHandle( SrvHandle );
  end;
  
end;

end.

 Conclusion

Notes, questions, commentaires, et insultes sont les bienvenus !

 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


 Historique

21 novembre 2006 16:36:52 :
Petite erreur !

 Sources du même auteur

Source avec Zip METHODE DE PROPAGATION D'UNE APPLICATION
Source avec Zip Source avec une capture WAKE ON LAN
Source avec Zip Source avec une capture POUR LES DEBUTANTS : NETTOYAGE RECURSIF
Source avec Zip INJECTER DLL DANS UN PROCESSUS EN COURS
Source avec Zip Source avec une capture GESTION DE LA TABLE DE ROUTAGE DE WINDOWS

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

 Sources en rapport avec celle ci

Source avec Zip OBTENIR LE PROPRIÉTAIRE D'UN FICHIER (WIN32;NTFS) par ILP
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip Source avec une capture PACKAGE MICROSOFT par blueperfect
Source avec Zip Source avec une capture COMPOSANT TLOG UTILISANT UNE DLL par Bacterius
Source avec Zip Source avec une capture ALPHA UTILS par Bacterius

Commentaires et avis

Commentaire de elguevel le 21/11/2006 16:31:35

Ah oui j'ai oublier de citer le site qui ma servie de reférence : http://www.developpez.com/delphi/faq/?page=services-nt

Vous y trouverez toute l'aide necessaire.

Commentaire de Delphiprog le 21/11/2006 18:25:21 administrateur CS

Code très intéressant. Merci de nous le faire partager.

Question : ce code fonctionne-t-il aussi avec des droits restreints ?

Commentaire de cantador le 21/11/2006 19:03:32

un petite demo ça serait sympa..
merci

Commentaire de elguevel le 21/11/2006 20:20:01

J'ai posté la source assez rapidement, mais elle n'est pas vraiment terminée... il reste encore à faire.

Sinon non, le défaut des API est qu'elles sont soumises aux droits qu'à l'utilisateur.

Sinon CANTADOR ... qu'attends tu comme démo ? Le programme est là pour çà !

Pour visualiser vos services, faites bouton droit sur le poste de travail > propriété > et dans la console MMC chercher Services (en bas). Voila vous pourrez comparer par vous même.

Merci.

Commentaire de cantador le 21/11/2006 22:20:50

j'ai tout lu et c'est good.
l'intérêt c'est la machine distante..
mais comme delphiProg, et si tout est verrouillé ?

Commentaire de elguevel le 22/11/2006 08:51:57

Si tout est verouillé, alors il faut trouver une autre méthode... IPC, mailslot.. il doit bien y avoir un moyen, mais certainement bcp plus compliqué a mettre en oeuvre, surtout si il y à une verification des droits.

Et je viens de m'appercevoir que j'ai ecris une grosse connerie, donc je corrige, pour voir vos services, faite :
Bouton Droit sur le "Poste de travail" > "Gérer" > "Service et Application" > "Services"

Commentaire de cirec le 23/11/2006 14:36:13 administrateur CS

Salut,

Où encore "Menu Demarrer" --> "Executer" --> "services.msc /s"

Commentaire de elguevel le 23/11/2006 15:26:26

Tout à fait c'est beaucoup plus direct, mais neamoins il faut se souvenir de la commande MMC :-)

On peut aussi passer par le menu démarrer et aller dans Outils d'administration > Services...

Enfin les liens ne manquent pas.

Merci ;-)

Commentaire de taye78 le 23/11/2006 20:28:19

Je n'ai pas regardé le source mais comme la régle est la même pour tous:
Sans droit administrateur l'utilisateur n'aura pas accès a l'administration des services.
Pour que le programme ait accès aux APIs win32(ou natives évidement) d'administration de service, il devra être lancé a partir d'un utilisateur avec les droits necessaires ou les obtenir par divers méthodes/APIs:
User interactif, LogonUser, ImpersonateLoggedOnUser (utiliser les droits (ACL etc) d'un utilisateur déjà loggé et opérer grace a eux), CreateProcessAsUser etc... et j'en passe

Commentaire de taye78 le 23/11/2006 20:28:51

Source interessant, bravo.

Commentaire de jojoprout le 06/12/2006 21:47:29

Une petite correction au niveau de la function ServiceCreate : remplacer la ligne 57 [ H_SC := ServiceOpen( SrvName, Machine ); ] par [ H_SC := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); ], car la function CreateService de l'API winsvc suppose que le Handle ait été ouvert par OpenSCManager. J'avoue que j'ai mis un peu de temps avant de comprendre l'erreur ! Pour le reste, tout fonctionne, si ce n'est la fermeture du service où je suis obligé de lancer pour certains services 2 fois un ServiceStop : pb de tempo ?

Commentaire de elguevel le 07/12/2006 13:00:10

Je vais me faire lincher si je dis çà, mais je n'ai même pas testé mon application. J'ai repris un ancien code auquel j'ai ajouté cette histoire de service et d'acces au registre distant, mais ayant codé çà au boulot un matin, j'ai pas voulu tester çà sur place, d'autant que je ne possède pas de droit suffisants.

Sinon merci d'avoir testé l'application, mais ta correction n'est pas juste puisque [ ServiceOpen( SrvName, Machine ); ] est une fonction que j'ai crée et qui appelle bien [OpenSCManager].


{ Ouvre un service }
function ServiceOpen( SrvName : string; Machine : string = '' ) : Cardinal;
var
  H_SC : SC_Handle;
begin
  if ( Machine = '' ) then
    H_SC := OpenSCManager( nil, nil, SC_MANAGER_ALL_ACCESS )
  else
    H_SC := OpenSCManager( PChar( Machine ), nil, SC_MANAGER_ALL_ACCESS );

  Result := OpenService( H_SC,
                         PChar( SrvName ),
                         SC_MANAGER_ALL_ACCESS );
end;

Tu doit confondre mon "ServiceOpen" avec l'API "OpenService" !


PS : Promis dès que j'aurai le temps, j'ferai un truc plus  propre !

Merci, et bon code!

Commentaire de elguevel le 07/12/2006 13:14:35

Ah mais M****, j'me suis complétement trompé de source, je penssais que tu me parlais d'une autre ... méa culpa.

Donc oublie le premier paragraphe de mon commentaire precedant.

Par contre l'histoire du "OpenService" tiens toujours :-)

Commentaire de jojoprout le 07/12/2006 15:23:59

Désolé de te contredire, mais ma modif tient toujours, car avec ta function ServiceOpen, tu essaies d'ouvrir un service qui n'existe pas encore. Donc, deux solutions, soit directement passer par H_SC := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); dans la function ServiceCreate ou modifier ta function ServiceOpen comme ceci :
function ServiceOpen( SrvName : string; Machine : string = '' ) : Cardinal;
var
H_SC : SC_Handle;
begin
if ( Machine = '' ) then
H_SC := OpenSCManager( nil, nil, SC_MANAGER_ALL_ACCESS )
else
H_SC := OpenSCManager( PChar( Machine ), nil, SC_MANAGER_ALL_ACCESS );

if ( SrvName = '' ) then
result := H_SC
else
Result := OpenService( H_SC,
PChar( SrvName ),
SC_MANAGER_ALL_ACCESS );
end;
... et dans la function ServiceCreate , modifier la ligne H_SC := ServiceOpen( SrvName, Machine ); par H_SC := ServiceOpen( '', Machine );

Je ne suis qu'un débutant, mais mes tests le prouvent et d'ailleurs dans la SDK Windows il est dit de passer direct par OpenSCManager sans passer par OpenService.

Commentaire de elguevel le 07/12/2006 15:33:12

Ah mais oui je vois le problème ... tu as tout a fait raison.

En fait j'avais crée ma fonction "ServiceOpen" pour evité d'avoir à faire mon "H_SC := OpenSCManager( nil, nil, SC_MANAGER_ALL_ACCESS )" à chaque fonction (create, remove, etcc...) mais effectivement pour le create çà ne marche pas car comme tu le dis si bien ... on ne peux pas ouvrir un service qui n'a pas encore été crée :-)

Bien vu ;-)

Merci, et je corrigerai çà dès que possible (oula j'ai de plus en plus de boulot là)

Commentaire de jojoprout le 08/12/2006 21:55:17

Me revoici me revoila...

Je te propose une function complémentaire à ton unité ElgServiceNT, une fonction permettant d'indiquer la description du service. Pour ce faire, il nous faut au préalable ajouter une unité supplémentaire permettant de combler un oubli(?) dans l'unité WinSvc. En effet, la function permettant de faire la description du service est ChangeServiceConfig2 et elle ne s'y trouve pas dans WinSvc.

Voici la nouvelle unité :

unit WinSVC_fragment;

interface

uses WinSVC, Windows;

function ChangeServiceConfig2A(hService: SC_HANDLE; dwInfoLevel: DWord;
  lpInfo: Pointer): BOOL; stdcall;
function ChangeServiceConfig2W(hService: SC_HANDLE; dwInfoLevel: DWord;
  lpInfo: Pointer): BOOL; stdcall;
function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: DWord;
  lpInfo: Pointer): BOOL; stdcall;

type
  _SERVICE_DESCRIPTIONA = packed record
    lpDescription: PChar;
  end;
  TServiceDescriptionA = _SERVICE_DESCRIPTIONA;
  PServiceDescriptionA = ^TServiceDescriptionA;

  _SERVICE_DESCRIPTIONW = packed record
    lpDescription: PWChar;
  end;
  TServiceDescriptionW = _SERVICE_DESCRIPTIONW;
  PServiceDescriptionW = ^TServiceDescriptionW;

  //we use the ANSI version
  TServiceDescription = TServiceDescriptionA;

const
  SERVICE_CONFIG_DESCRIPTION     = 1;
  SERVICE_CONFIG_FAILURE_ACTIONS = 2;

implementation

function ChangeServiceConfig2A; external advapi32 name 'ChangeServiceConfig2A';
function ChangeServiceConfig2W; external advapi32 name 'ChangeServiceConfig2W';
function ChangeServiceConfig2; external advapi32 name 'ChangeServiceConfig2A';

end.

...la nouvelle function dans ton unité :

{ajoute une description du service}
function ServiceDescription(const Value: String; SrvName : string; Machine : string = '') : Boolean;
var
  sd: TServiceDescription;
  SrvHandle : Cardinal;
begin
  SrvHandle := ServiceOpen( SrvName, Machine );
  sd.lpDescription := PChar(Value);
  try
  result := ChangeServiceConfig2(SrvHandle, SERVICE_CONFIG_DESCRIPTION, @sd);
  finally
  CloseServiceHandle( SrvHandle );
  end;
end;

...ne pas oublier bien entendu de rajouter
dans la partie uses WinSvc_fragment.

Cette nouvelle function s'utilisera comme les précédentes...

PS : je l'ai testé et ô miracle ça marche !

Commentaire de taye78 le 23/06/2007 20:32:07

simple et pratique

Commentaire de bhf37 le 26/12/2007 15:49:41

Bonjour.
Le code est génial pour le pc local mais ne fonctionne pas sur un pc sur le réseau local...
Pourquoi ??

Commentaire de becauet le 06/05/2008 19:01:00

En effet. il faut faire la modif de jojoprout dans ServiceCreate si non, ca ne fonctionne pas.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Les Api Windows [ par twoupy ] Est-ce que quelqu'un possède ou sait où je pourrais trouver l'aide sur les Api Windows (win32.hlp) en français. ce serait bien cool, parce que l'angl documentation API [ par Noureddine ] Bonjour,je cherche la documentation pour comprendre L'API, si vous avez une adresse ou je peut télécharger une documentation en français SVPMerci. problème avec une api [ par fabiin ] SalutEst-ce que kelk'un rencontre un problème lors de l'utilisation desetDCbrushcoloren Delphi 6Merci par avance@+Fabse Comment utiliser une API avec Delphi 5? [ par Manthis ] Salut,Je débute tout juste en Delphi 5. J'avais commencer par le VB. Et donc voila j'ai un problème comment utiliser une API avec Delphi?Ou doit-on la API sndPlaySoundA [ par jlg75 ] j'utilise l'API 'sndPlaySoundA' tirée de 'winmm.dll' pour lire des .wav dans un prog DELPHI. Je déclare explicitement cet API comme fonction 'external CHERCHE TUT DELPHI API [ par golum ] Salut je suis a la recherche d'un tut Delphi et API un peu comme EstDev pour VBAuriez vous quelque chose ? des adresses ? Winsock [ par SMoG ] Yop... Je desespere de trouver un jour de la doc sur l'api winsock avec des exemples delphi...Si qqn pouvait m'expliquer comment deux machines se con API msn messenger [ par achovovich ] BonjourJe voudrai creer un add on pour msn messenger. Je sais ke ceci es faisable en VB et bcp d'exemples existent mais en delphi, rien. Je ne sais me fenetres bizzarres [ par ak47 ] bonjour a tous,J'ai lu dans un article qu'on pouvait faire des fenetres "bizarres" (de part leurs formes) grace a une api de windows. Malheureusement, Fonction API GetOpenFileName ??? [ par PhGORMAND ] Salut à tous.Je cherche à utiliser la fonction API GetOpenFileName, mais je ne parvient pas à l'utiliser.Dans le code ci dessous, je fais appel à la f


Nos sponsors


Sondage...

Comparez les prix

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 : 1,560 sec (3)

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