OVH Cloud OVH Cloud

Problem DCOM et QueryInterface

7 réponses
Avatar
Michael Moreno
Bonjour,

Je cree un objet COM sur un autre serveur EXE et j'essaie de caster
l'objet en une autre interface sans succes.

Voici le code

Type t = Type.GetTypeFromProgID(DCOMProgID, MachineName, true);
object o = Activator.CreateInstance(t);
m_DCOMServer = o as SD_ServerIntf.ISWS_Server;
if (m_DCOMServer == null)
MessageBox.Show("Failed");

Si je cree l'objet sur la meme machine cela marche parfaitement.
Si je cree l'objet sur une machine distante l'objet est cree, plus
precisemment o est bien cree et sur la machine distante je vois que
l'objet est cree, mais le cast ne marche pas et m_DCOMServer vaut null.

Auriez-vous une idee svp ?

Merci.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/

7 réponses

Avatar
Fabrice MALAINGRE
Bonsoir Michael,

Je cree un objet COM sur un autre serveur EXE et j'essaie de caster
l'objet en une autre interface sans succes.

Voici le code
Type t = Type.GetTypeFromProgID(DCOMProgID, MachineName, true);
object o = Activator.CreateInstance(t);
m_DCOMServer = o as SD_ServerIntf.ISWS_Server;
if (m_DCOMServer == null)
MessageBox.Show("Failed");

Si je cree l'objet sur la meme machine cela marche parfaitement.
Si je cree l'objet sur une machine distante l'objet est cree, plus
precisemment o est bien cree et sur la machine distante je vois que
l'objet est cree, mais le cast ne marche pas et m_DCOMServer vaut null.
Auriez-vous une idee svp ?



J'aurais plutôt deux questions :
1) Est-ce que l'objet "o" est bien non null côté client lors d'une
instanciation sur la machine distante ?
Ou est-ce seulement le cast qui ne fonctionne pas ?

2) Est-ce que les droits de l'objet COM instancié ont été spécifiés côté
serveur distant,
sachant que l'utilisateur qui effectue la demande soit être connu de ce
serveur ?

Cordialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Avatar
Michael Moreno
Bonjour,

J'aurais plutôt deux questions :
1) Est-ce que l'objet "o" est bien non null côté client lors d'une
instanciation sur la machine distante ?



oui o est non null

Ou est-ce seulement le cast qui ne fonctionne pas ?



C'est bien le cast qui ne marche pas.


2) Est-ce que les droits de l'objet COM instancié ont été spécifiés côté
serveur distant,
sachant que l'utilisateur qui effectue la demande soit être connu de ce
serveur ?



DCOM est bien configure.

Merci.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Fabrice MALAINGRE
>> J'aurais plutôt deux questions :
1) Est-ce que l'objet "o" est bien non null côté client lors d'une
instanciation sur la machine distante ?


oui o est non null



Ou est-ce seulement le cast qui ne fonctionne pas ?


C'est bien le cast qui ne marche pas.



2) Est-ce que les droits de l'objet COM instancié ont été spécifiés côté
serveur distant,
sachant que l'utilisateur qui effectue la demande soit être connu de ce
serveur ?


DCOM est bien configure.



OK, cela a le mérite d'être claire...
Continuons donc de procéder par élimination :

1) La définition de l'interface ISWS_Server est-elle assurée par le
composant serveur lui même où par un composant tiers ?
Corollaire : est-elle bien enregistrée côté serveur... et côté client ?

2) La dll de marshalling associée à cette interface est-elle bien présente
et enregistrée côté client ?

Cordialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Avatar
Michael Moreno
> 1) La définition de l'interface ISWS_Server est-elle assurée par le composant
serveur lui même où par un composant tiers ?
Corollaire : est-elle bien enregistrée côté serveur... et côté client ?



C'est dans une tlb qui est correctement enregistree cote serveur et
client (cela marche parfaitement si le client et le serveur sont lances
sur la meme machine et ce sur les 2 machines)

2) La dll de marshalling associée à cette interface est-elle bien présente et
enregistrée côté client ?



La dll est bien presente et elle est privee => pas d'enregistrement a
faire. L'appli charge la bonne dll. Je n'ai pas 350 versions mais bien
une seule et unique version de la dll meme si Visual Studio duplique a
tout va les dlls.

J'ai fait des tests supplementaire. Si je fais:

Type t = Type.GetTypeFromProgID(DCOMProgID, MachineName, true);
SWS_PriceCacheServerClass o =
(SWS_PriceCacheServerClass)Activator.CreateInstance(t);
m_DCOMServer = o as SD_ServerIntf.ISWS_Server;

Alors cela marche. Mais dans ce cas je perds l'utilite de passer par
des interfaces et la fonction n'est plus du tout generique ce que je
souhaite eviter.

Merci beaucoup.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Michael Moreno
> Type t = Type.GetTypeFromProgID(DCOMProgID, MachineName, true);
SWS_PriceCacheServerClass o =
(SWS_PriceCacheServerClass)Activator.CreateInstance(t);
m_DCOMServer = o as SD_ServerIntf.ISWS_Server;



Cela ne marche pas. Cela ne plante pas mais au premier appel suivant ca
plante en me disant que QueryInterface n'a pas marche...

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Arnaud Debaene
Michael Moreno wrote:

DCOM est bien configure.



Y compris avec les nouvelles "limites" de sécurité qui ont été rajoutées
dans XP SP2?

Elles sont accessibles par dcomcnfg, propriétés de la machine, onglet
"Sécurité COM". Dans un 1er temps pour tes tests, mets les droits distants
à "Tout le monde" et à "ANONYMOUS LOGON" (j'ai vu des cas où il me semblait
que l'impersonation se faisait après applications du filtrage par limites,
mais ce n'est pas très clair et affreusement mal documenté).

Arnaud
MVP - VC
Avatar
Michael Moreno
> Elles sont accessibles par dcomcnfg, propriétés de la machine, onglet
"Sécurité COM". Dans un 1er temps pour tes tests, mets les droits distants à
"Tout le monde" et à "ANONYMOUS LOGON" (j'ai vu des cas où il me semblait que
l'impersonation se faisait après applications du filtrage par limites, mais
ce n'est pas très clair et affreusement mal documenté).



C'est deja fait. C'est pour cela que je peux lancer le serveur et cree
l'objet.

Je crois que je vais tout formatter et recommencer depuis le debut.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/