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