OVH Cloud OVH Cloud

Récupérer le CLSID d'un objet d'une machine distante

9 réponses
Avatar
PurL
Bonjour,

Je voudrais faire un CoCreateInstanceEx pour instancier un objet COM
d'une machine distante. Comment demander =E0 la machine distante le
CLSID (param=E8tre n=E9cessaire pour CoCreateInstanceEx) de l'objet en
question ?

Merci,

PurL

9 réponses

Avatar
Vincent Burel
c'est pas très logique, en générale, on connait le CLSID de l'objet qu'on
veut créer.
Si on ne le connais pas, alors il y a une API (ou un enumerator) spéciale
qui permet d'obtenir ces CLSID. Cette API dépend du type d'objets que vous
voulez créer.

VB

"PurL" wrote in message
news:
Bonjour,

Je voudrais faire un CoCreateInstanceEx pour instancier un objet COM
d'une machine distante. Comment demander à la machine distante le
CLSID (paramètre nécessaire pour CoCreateInstanceEx) de l'objet en
question ?

Merci,

PurL
Avatar
PurL
En local non plus tu ne connais pas le CLSID de l'objet que tu veux
utiliser. Tu connais son nom et CLSIDFromProgID te donne son CLSID.
Oui finalement, je voudrais faire un CLSIDFromProgID sur un systeme
distant.

Est-ce possible ?

PurL
Avatar
Paul Bacelar
Fais le CLSIDFromProgID en local et utilises le CLSID trouvé. Le CLSID d'un
composant n'est pas fonction de la machine si le ProgID contient la version
du composant.

--
Paul Bacelar

"PurL" wrote in message
news:
En local non plus tu ne connais pas le CLSID de l'objet que tu veux
utiliser. Tu connais son nom et CLSIDFromProgID te donne son CLSID.
Oui finalement, je voudrais faire un CLSIDFromProgID sur un systeme
distant.

Est-ce possible ?

PurL



Avatar
Paul Bacelar
Fais le CLSIDFromProgID en local et utilises le CLSID trouvé. Le CLSID d'un
composant n'est pas fonction de la machine si le ProgID contient la version
du composant.

--
Paul Bacelar

"PurL" wrote in message
news:
En local non plus tu ne connais pas le CLSID de l'objet que tu veux
utiliser. Tu connais son nom et CLSIDFromProgID te donne son CLSID.
Oui finalement, je voudrais faire un CLSIDFromProgID sur un systeme
distant.

Est-ce possible ?

PurL



Avatar
PurL
Il est effectivement là le probleme.
Le CLSID lié à l'objet est sur la machine distante. Et j'ai remarqué
pas mal de setup de ce genre d'objet avoir uniquement une procédure
pour installer que les clés du registre necessaire à reconnaitre
l'objet sans l'installer. Tout ça pour y avoir accès à distance.

Moi, j'aimerais ne rien installé sur la machine cliente, et avoir une
procédure poour demander à une machine distante si elle a un CLSID
correspondant à une certaine chaine de caracteres et si oui, me le
retourner pour m'en servir apres dans CoCreateInstanceEx.

PurL
Avatar
Patrick Philippot
Bonjour,

Moi, j'aimerais ne rien installé sur la machine cliente, et avoir une
procédure poour demander à une machine distante si elle a un CLSID
correspondant à une certaine chaine de caracteres et si oui, me le
retourner pour m'en servir apres dans CoCreateInstanceEx.



Tout cela ressemble très fort à un faux problème :-) .

Si vous n'enregistrez rien sur la machine locale, la correspondance
entre le ProgId et le CLSID n'existe pas localement, ok? Si vous ne
voulez pas passer à CoCreateInstanceEx le CLSID directement, il faut
bien aller le chercher sur le serveur cible, ok? Et où allez vous
trouver la correspondance entre votre ProgId et votre CLSID? Dans la
registry du serveur. Vous vous connectez sur la registry du serveur et
vous cherchez à ouvrir HKCR<votre_progid>, puis vous regardez dans la
sous-clé CLSID (valeur par défaut).

La question est maintenant: "Pourquoi voudriez vous vous compliquer la
vie à ce point?".

Le couple ProgId/CLSID est intangible. Mise à part la probabilité
extrêmement faible de collision sur les ProgIds, un ProgId est toujours
associé au même CLSID. Donc si vous connaissez le ProgId au moment de
l'écriture du code, vous connaissez aussi le CLSID. Il suffit de
regarder la Registry d'une machine où ce composant est installé.

Si par contre votre programme cherche à instancier un objet COM remote
par son CLSID à partir d'une information (ProgId) fournie par
l'utilisateur, vous devez passer par l'interrogation de la registry du
serveur remote. Le mieux dans ce cas est d'alller lire les ProgIds
disponibles dans la registry de la machine remote et de présenter la
liste à l'utilisateur.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
PurL
>Si par contre votre programme cherche à instancier un objet COM remote
par son CLSID à partir d'une information (ProgId) fournie par
l'utilisateur, vous devez passer par l'interrogation de la registry du
serveur remote. Le mieux dans ce cas est d'alller lire les ProgIds
disponibles dans la registry de la machine remote et de présenter la
liste à l'utilisateur.



C'est exactement ce que je veux faire :)
Comment explore-t-on la base registre d'une machine distante ?

Merci,

PurL
Avatar
Patrick Philippot
PurL wrote:
C'est exactement ce que je veux faire :)
Comment explore-t-on la base registre d'une machine distante ?



Avec les mêmes fonctions qu'en local. Il faut juste appeler
RegConnectRegistry avec les permissions adéquates bien sûr. Voir la doc
de cette API.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Salut Paul,

Fais le CLSIDFromProgID en local et utilises le CLSID trouvé. Le
CLSID d'un composant n'est pas fonction de la machine si le ProgID
contient la version du composant.



Oui, mais notre ami ne veut pas enregistrer en local. En fait, il veut
reproduire le comportement de CreateObject en VB6 qui peut prendre,
outre le ProgId, un argument optionnel: le nom du serveur distant. Dans
ce cas, aucune inscription locale de l'objet n'est nécessaire. Je n'ai
pas de détails sur la manière dont fonctionne CreateObject dans ce cas
mais je suppose qu'il va lire la registry distante.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr