OVH Cloud OVH Cloud

CComModule::RegisterServer() : Programmation d'un composant COM

5 réponses
Avatar
AG
Bonjour,

Je cherche à comprendre pourquoi le code ci-dessous passe quand je suis
admin et pas quand je suis utilisateur normal :

CComModule _Module;

STDAPI DllRegisterServer (void)
{
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
HRESULT hRes;

// Registers object, typelib and all interfaces in typelib
hRes = _Module.RegisterServer (TRUE);
if (FAILED (hRes))
return hRes;


Il s'agit du début de la fonction DllRegisterServer().

D'une part je n'arrive pas à savoir pourquoi RegisterServer() renvoie
une erreur, ni à quoi cette erreur corresponds. (Visiblement c'est quand
même un problème d'écriture dans le registre à un endroit interdit pour
les simples utilisateurs).

D'autre part comment dois-je m'y prendre pour enregister mon module en
tant que non Admin ?

Je me perds dans la MSDN, j'ai lu une bonne partie de la présentation du
sandard COM, pas tout je l'avoue, et un peu les exemples, mais là j'y
arrive vraiment pas, il me faut un petit coup de pouce, je ne sais plus
trop par ou chercher.

Merci d'avance.

Alexandre.

5 réponses

Avatar
Thierry
In article <40783af9$0$17517$, says...

D'une part je n'arrive pas à savoir pourquoi RegisterServer() renvoie
une erreur, ni à quoi cette erreur corresponds. (Visiblement c'est quand
même un problème d'écriture dans le registre à un endroit interdit pour
les simples utilisateurs).



C'est ça : les objets COM s'enregistrent dans HKLM, dont l'ecriture
n'est possible qu'avec des droits d'admins.

D'autre part comment dois-je m'y prendre pour enregister mon module en
tant que non Admin ?



Ce n'est ni possible, ni souhaitable.

--
Thierry
Avatar
AG
Thierry wrote:
D'autre part comment dois-je m'y prendre pour enregister mon module en
tant que non Admin ?




Ce n'est ni possible, ni souhaitable.



Est ce que cela signifie que :

La dll (c'est une dll) doit être enregistrée une fois par
l'intermédiaire de la fonction DllRegisterServer() (qui elle même
appelle la fonction RegisterServer()) en tant qu'Admin. Ceci
correspondrait à l'installation.

Une fois la dll enregistré en tant qu'Admin, elle ne doit pas tenter de
recommencer ?

ça voudrait dire que je devrais modifier mon code comme ci-dessous ?

CComModule _Module;

STDAPI DllRegisterServer (void)
{
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
HRESULT hRes;

//teste si le module à déjà été enregistré une fois
// si oui, lancer _Module.RegisterServer(FALSE)
// si non lancer _Module.RegisterServer(TRUE)
// Registers object, typelib and all interfaces in typelib
hRes = _Module.RegisterServer (TRUE);
if (FAILED (hRes))
return hRes;


En tout cas Merci Thierry pour ces quelques précisions.


Alexandre.
Avatar
Thierry
In article <4079448c$0$18217$, says...
La dll (c'est une dll) doit être enregistrée une fois par
l'intermédiaire de la fonction DllRegisterServer() (qui elle même
appelle la fonction RegisterServer()) en tant qu'Admin. Ceci
correspondrait à l'installation.



Oui : pas besoin de l'enregistrer a chaque fois.

Une fois la dll enregistré en tant qu'Admin, elle ne doit pas tenter de
recommencer ?



Elle peut tenter mais ca ne marchera pas.

ça voudrait dire que je devrais modifier mon code comme ci-dessous ?



Plutot que de toucher a cette fonction ne l'appelle que lors de
l'installation.

--
Thierry
Avatar
AG
Thierry wrote:
ça voudrait dire que je devrais modifier mon code comme ci-dessous ?





Plutot que de toucher a cette fonction ne l'appelle que lors de
l'installation.



Merci Thierry, je vois le bout du tunnel.

Ce n'est pas moi qui gère l'appel à cette fonction. La fonction est
appelée automatiquement, et si elle ne renvoie pas le bon code d'erreur,
je ne peux pas accéder à mon add-in.

En modifiant la fonction et en renvoyant S_OK si jamais la fonction à
déjà été enregistrée, tout fonctionne comme il faut.

Merci.

Alexandre.
Avatar
tresorunikin
AG a écrit le 10/04/2004 à 20h20 :
Bonjour,

Je cherche à comprendre pourquoi le code ci-dessous passe quand je suis

admin et pas quand je suis utilisateur normal :

CComModule _Module;

STDAPI DllRegisterServer (void)
{
AFX_MANAGE_STATE (AfxGetStaticModuleState ());
HRESULT hRes;

// Registers object, typelib and all interfaces in typelib
hRes = _Module.RegisterServer (TRUE);
if (FAILED (hRes))
return hRes;


Il s'agit du début de la fonction DllRegisterServer().

D'une part je n'arrive pas à savoir pourquoi RegisterServer() renvoie
une erreur, ni à quoi cette erreur corresponds. (Visiblement c'est quand

même un problème d'écriture dans le registre à un
endroit interdit pour
les simples utilisateurs).

D'autre part comment dois-je m'y prendre pour enregister mon module en
tant que non Admin ?

Je me perds dans la MSDN, j'ai lu une bonne partie de la présentation du

sandard COM, pas tout je l'avoue, et un peu les exemples, mais là j'y
arrive vraiment pas, il me faut un petit coup de pouce, je ne sais plus
trop par ou chercher.

Merci d'avance.

Alexandre.


Bcp d'années plutard...
Suis dans le même cas!
As-tu bien réalisé que tu cherchais tout simplement à utiliser et non créer? ou sinon tu voulais creer des élements pour un système d"exploitation?

ha! rien ne pourrit sur le web!