IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

service basé sur OLE/DCOM et Windows server 2003


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Billets dans le blog
    1
    Par défaut service basé sur OLE/DCOM et Windows server 2003
    Bonjour, j'ai crée un service qui utilise OLE/DCOM/COM+, celui-ci fonctionne parfaitement sous windows XP (lancement au démarage, fonctionnement), mais sous windows server 2003, le service ne se lance même pas, et laisse une erreur au démarrage comme quoi un service n'a pas pu demarrer et sous une session il m'indique un timeout.
    L'ancienne version n'utilise pas d'objet type OLE ou DCOM et marche très bien sous les deux windows.
    Depuis une mise a jour de builder 2009, j'ai droit a ce petit message en commentaire quand je crée un service:
    Project1.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <SysUtils.hpp>
    #include <SvcMgr.hpp>
    #pragma hdrstop
    #define Application Svcmgr::Application
    USEFORM("Unit1.cpp", Service1); /* TService: File Type */
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
     try
     {
     
    /*Le commentaire qui indique comment regler mon probleme*/
     
      // Windows 2003 Server requiert que StartServiceCtrlDispatcher soit
      // appelée avant CoRegisterClassObject, qui peut être appelée indirectement
      // par Application->Initialize. TServiceApplication->DelayInitialize permet à
      // Application->Initialize d'être appelée depuis TService->Main (après que
      // StartServiceCtrlDispatcher ait été appelée).
      //
      // L'initialisation différée de l'objet Application peut affecter
      // les événements qui surviennent alors avant l'initialisation, comme
      // TService->OnCreate. Ceci est seulement recommandé si ServiceApplication
      // enregistre un objet classe avec OLE et est destinée pour une
      // utilisation avec Windows 2003 Server.
      //
      // Application->DelayInitialize = true;
      //
      if ((!Application->DelayInitialize) || (Application->Installing()))
      {
       Application->Initialize();
      }
      Application->CreateForm(__classid(TService1), &Service1);
      Application->Run();
     }
     catch (Exception &exception)
     {
      Sysutils::ShowException(&exception, System::ExceptAddr());
     }
            catch(...)
            {
      try
      {
              throw Exception("");
      }
      catch(Exception &exception)
      {
       Sysutils::ShowException(&exception, System::ExceptAddr());
      }
            }
     return 0;
    }
    Unit1.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //---------------------------------------------------------------------------
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TService1 *Service1;
    //---------------------------------------------------------------------------
    __fastcall TService1::TService1(TComponent* Owner)
     : TService(Owner)
    {
    }
    TServiceController __fastcall TService1::GetServiceController(void)
    {
     return (TServiceController) ServiceController;
    }
    void __stdcall ServiceController(unsigned CtrlCode)
    {
     Service1->Controller(CtrlCode);
    }
    //---------------------------------------------------------------------------
    Unit1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <SvcMgr.hpp>
    #include <vcl.h>
    //---------------------------------------------------------------------------
    class TService1 : public TService
    {
    __published:    // Composants gérés par l'EDI
    private:        // Déclarations de l'utilisateur
    public:         // Déclarations de l'utilisateur
     __fastcall TService1(TComponent* Owner);
     TServiceController __fastcall GetServiceController(void);
     friend void __stdcall ServiceController(unsigned CtrlCode);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TService1 *Service1;
    //---------------------------------------------------------------------------
    #endif
    Voila, maintenant je voudrais savoir quelles sont les modification a ajouter pour mettre les dites fonctions présentées en commentaire, sachant que je ne trouve pas de solution dans google et dans les forums embarcadero c'est un bordel total pour s'y retrouver.
    Merci de votre aide, si minime soit t'elle

  2. #2
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Billets dans le blog
    1
    Par défaut
    Le problème peut être considéré comme résolu, en fait il ne faut pas utiliser directement le template du service fourni par c++ builder.
    Je posterait bientôt un exemple fait a partir d'un code source provenant de ANSI C Windows NT Services API Encapsulation v.1.6 de Vincent ROGIER
    disponible sur sourceforge à l'adresse http://sourceforge.net/projects/ntwinserv
    Normalement c'est une base Visual C++, que j'ai modifié (uniquement l'exemple qu'il donne), sinon son API ne cause aucun problème avec c++ builder (seul ceux qui ont c++ builder Unicode donc supérieur ou égal a 2007, devront modifier la librairie pour passer les bons paramètres qui est juste une histoire de char* et wchar_t*, qui se trouvent tous après quelques coup de compilo).
    Pour être su que mon exemple passe sur tous les pc windows XP, celui-ci sera basé sur WMI (Windows Management Interface), qui logera des infos du pc dans l'observateur d'evenement.
    extrait du readme:
    Cette librairie est une encapsulation complète de l'API de services Microsoft Windows NT (NT4, 2k, 2000 and Vista).

Discussions similaires

  1. Installer Squid sur un Windows Server 2003 ?
    Par beegees dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 18/11/2010, 09h18
  2. Réponses: 0
    Dernier message: 30/10/2009, 16h44
  3. Réponses: 5
    Dernier message: 22/03/2006, 14h05
  4. Application Delphi 6 qui plante sur Windows Server 2003
    Par david_chardonnet dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2006, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo