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

Windows Discussion :

Utilisation d'un service COM (ATL)


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Utilisation d'un service COM (ATL)
    Bonjour,
    je viens très régulièrement sur developpez.net lorsque je bloque sur certain problème de code et en général je trouve toujours une solution.

    Mais cette fois je suis complètement bloqué. J'essaye de faire un service windows qui gère des objets COM et de l'autre côté de faire une application qui utilise ces Objets COM.

    Sur le principe j'ai utilisé l'assistant de Visual Studio 2010 pour la création de projet ATL en version Service (EXE). J'ai ensuite ajouté mon objet simple ATL et une fonction DoStuff (qui fait pas grand chose mais bon l'idée est là).
    Jusque là tout va bien.

    D'un autre côté j'ai crée une application console (toujours sous visual studio 2010 en C++) qui permet d'utiliser cette objet COM au travers du service. Et là, pas moyen... J'ai sur le CoCreateInstance une erreur "Server Execution Failed". Et je ne comprend pas vraiment d'où cela peut provenir.

    Ma seule piste serait de la gestion de la sécurity du côté du service. J'essaye donc d'utilisez le fonction CoInitializeSecurity avec un peu tous les paramètres possible mais toujours rien... soit le service ne se lance plus, soit ça ne change rien...


    Du coup, je viens vous demander de l'aide:
    - Est-ce que vous avez une idée du problème?
    - Est-ce que vous savez comment utiliser CoInitializeSecurity ?
    - Est-ce que je suis complètement parti n'importe où?

    Pour vous donner plus de détails voici la fonction InitializeSecurity côté service:
    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
    		HRESULT InitializeSecurity() throw()
    	{
    		HRESULT hr;
    		DWORD err;
    		PSECURITY_DESCRIPTOR*  secur;
    		
    		hr = CoInitialize(NULL);
    		
    		PSECURITY_DESCRIPTOR cSecurity;
    		if(InitializeSecurityDescriptor(&cSecurity, SECURITY_DESCRIPTOR_REVISION) == 0){
    			return -1;
    		}
    
    		hr = CoInitializeSecurity( &cSecurity, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); 
    		if (FAILED(hr))
    		{	
    			return -1;
    		}
    		return S_OK;
    	}
    Et le côté client pour l'utilisation de l'objet COM:
    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
    52
    int _tmain(int argc, _TCHAR* argv[])
    {
     // Variables Locales 
      HRESULT        hr;            // Resultas d'appels COM
      IDoTruc             *pDo = NULL;			// Pointeur sur DoSomething
      IClassFactory  *pFactory = NULL;     // Pointeur sur IClassFactory
    
      // Initialisation de la librairie COM
      hr  = CoInitialize(NULL);
      if (FAILED(hr))
      {
        cout << "Error: Initialise lib COM" << endl ;
        return -1;
      }
    
    
      hr = CoCreateInstance(CLSID_DoTruc, NULL, CLSCTX_SERVER, IID_IDoTruc, (void  **) &pDo);
    	  if (FAILED(hr))
      {
    	  cout << "Error: CreateInstance! (COM) " << endl ;
    	CoUninitialize();
    	 getchar();
        return -1;
      }
    
      if (pDo == NULL)
      {
         cout << "Error: Interface pointer NULL! (COM) " << endl ;
    	CoUninitialize();
        return -1;
      }
    
      VARIANT str;
      hr = pDo->DoStuff2(&str);
      cout << str.bstrVal << endl;
      
      // Libération de l'inteface IDo
      hr = pDo->Release();
      if (FAILED(hr))
      {
    	  cout << "Error: Release interface! (COM) " << endl ;
    	  CoUninitialize();
    	  return -1;
      }
       
      // Fermeture de la librairie COM
      CoUninitialize();
    
      getchar();
      return 0;
    }
    Bon le code est assez sale parce que j'ai fais plein d'essaies dans tous les sens...

    Dans tous les cas merci d'avance de votre aide.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Alors je m'auto-répond... Je viens de trouver la solution.

    En faite, je n'étais pas du tout partis dans la bonne solution.
    Le problème venait bien du côté service mais de la création du registre.
    Il semblerait que le wizard ATL de visual studio soit buggé et du coup il manque une ligne dans le fichier MonObjCom.rgs.

    Il manque la ligne :
    val AppID = s '%APPID%'

    Pour plus de détails voici la page où j'ai trouvé la solution:
    http://sachinladdha.blogspot.com/201...e-returns.html

    En espérant que cela puisse servir à quelqu'un d'autre...
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation des grids services
    Par weldata dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 18/10/2006, 09h15
  2. [COM] Utilisation d'un objet COM
    Par Sophy75 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 03/04/2006, 18h43
  3. [Axis] Utilisation d'un service soap avec Axis.
    Par avalone dans le forum Services Web
    Réponses: 3
    Dernier message: 14/02/2006, 15h17
  4. [C#] Comment utiliser tous les ports COM ?
    Par Seb.26 dans le forum C#
    Réponses: 2
    Dernier message: 10/01/2006, 16h34
  5. [COM-ATL] Savez vous ce qu'est l'aggregation ?
    Par akecooco dans le forum MFC
    Réponses: 1
    Dernier message: 11/10/2002, 15h12

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