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:
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 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; }
Bon le code est assez sale parce que j'ai fais plein d'essaies dans tous les sens...
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; }
Dans tous les cas merci d'avance de votre aide.
Partager