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 :

Obtention de l'uid d'une Interface


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut Obtention de l'uid d'une Interface
    Bonjour

    Je voudrais obtenir, à partir d'un ProgId (style [Vendor.] Component[ .Version]) l'uuid de l'interface associé.
    En parcourant la MSDN je n'ai rien vu, et dans la base de registres je ne trouve rien qui fasse le lien.
    Si vous avez une idéee, merci.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Interface... tu confonds pas avec la classe des fois ?
    Le CLSID se trouve dans HKLM\<ton ProgId>\CLSID. CLSIDFromProgID s'occupe de faire la recherche.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    non, non.
    A partir du progID j'arrive à obtenir le CLSID avec justement CLSIDFromProgID.
    Mais j'ai besoin de l'uuid de l'interface pour le XXX->QueryInterface(uuid, (void **) ptr).
    Je cite de mémoire, je n'ai pas le code sous le nez.
    Je voudrais en fait simuler plus ou moins le comportement des Serveur.CreateObject(<progid>) qu'on rencontre dans les pages asp.
    PS désolé, je ne maîtrise pas bien le vocabulaire, mais je sais ce que je recherche
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    En fait, tu voudrais obtenir la liste des interfaces qu'une classe d'objet COM exporte... C'est vrai que tu ne peux pas l'obtenir à partir de sa IUnknown...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Une classe implémente plusieurs interfaces, y'en a pas une seule associée, et une interface n'est pas associée à une seule classe en particulier.
    2 possibilités:
    - soit ton objet COM possède un typelib, et alors tu peux demander à VC++ de te générer tout le code via #import.
    - soit il implémente IDispatch qui te permet de savoir tout ce qu'implémente ton composant. Fait un QueryInterface sur IDispatch. Ensuite, c'est laborieux...

    Si c'est juste pour étudier un composant, utilise OLE Viewer (menu outils de VC++ -> explorateurs d'objets OLE).
    Le fonctionnement du CreateObject est expliqué ici:
    http://www.windowsitlibrary.com/Content/534/04/2.html
    ça utilise l'interface par défaut

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Aurelien >> et merci
    J'ai suivi ta deuxième proposition et ça marche parfaitement !
    Ça n'a pas été trop laborieux car je connaissais le nom des méthodes et le nombre d'arguments, il me manquait juste le pointeur vers l'interface.

    Maintenant, j'ai une autre question :
    Pour utiliser l'objet COM, j'ai donc utilisé ce bout de code trouvé dans MSDN
    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
    53
    54
    55
    BOOL InitCom&#40;CString Interface, LPDISPATCH *ptr&#41;
    &#123;
    	HRESULT hr = CoInitializeEx&#40;NULL,COINIT_APARTMENTTHREADED&#41;;
    	if &#40;FAILED&#40;hr&#41;&#41;
    	&#123;
    		AfxMessageBox&#40;"Pb CoInitializeEx"&#41;;
    		return FALSE;
    	&#125;
    
       IUnknown *pUnk = NULL;
       CLSID clsid;
       CComBSTR bstrMyString&#40; Interface &#41;;
    
        hr = CLSIDFromProgID&#40;bstrMyString, &clsid&#41;;
    	if &#40;FAILED&#40;hr&#41;&#41;
    	&#123;
    		AfxMessageBox&#40;"Pb CLSIDFromProgID"&#41;;
    		return FALSE;
    	&#125;
    
    		
       //
       // Create an instance of the SimpleCalculator object 
       // and grab an IUnknown interface.
       //
       hr = CoCreateInstance&#40;
             clsid, 
             NULL, 
             CLSCTX_INPROC_SERVER, 
             IID_IUnknown, 
             &#40;void**&#41;&pUnk&#41;;
    
       if &#40;FAILED&#40;hr&#41;&#41; 
       &#123;
    		AfxMessageBox&#40;"Pb CoCreateInstance"&#41;;
    		return FALSE;
       &#125;
       hr = pUnk->QueryInterface&#40; IID_IDispatch, &#40;void **&#41;ptr&#41;;
    
       if &#40;FAILED&#40;hr&#41;&#41; 
       &#123;
    	CString str;	
    	   switch&#40;hr&#41;
    		&#123;
    		case E_NOINTERFACE &#58;  str = "E_NOINTERFACE "; break;
    		case S_OK &#58;  str = "S_OK "; break;
    		default &#58; str = "default"; break;
    		&#125;
    	   AfxMessageBox&#40;str&#41;;
    		return FALSE;
       &#125;
       pUnk->Release&#40;&#41;; // Don't need this any more. 
       pUnk = NULL;
       return TRUE;
    &#125;
    Connaissant le ProgID et les méthodes est-ce qu'il y a plus simple ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    A priori tu peux virer ton code concernant IUnknown et directement demander IDispatch. De même, si tu connais l'interface à utiliser, tu peux oublier IDispatch et directement demander cette interface...

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Oui, mais je voulais simuler les CreateObject, donc je connais le progID et les méthodes et je travaille avec.
    J'ai viré ce qui concerne le IUnknown et ça fonctionne très bien

    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
    BOOL InitCom&#40;CString Interface, LPDISPATCH *ptr&#41;
    &#123;
    	HRESULT hr = CoInitializeEx&#40;NULL,COINIT_APARTMENTTHREADED&#41;;
    	if &#40;FAILED&#40;hr&#41;&#41;
    	&#123;
    		AfxMessageBox&#40;"Pb CoInitializeEx"&#41;;
    		return FALSE;
    	&#125;
    
       CLSID clsid;
       CComBSTR bstrMyString&#40; Interface &#41;;
    
        hr = CLSIDFromProgID&#40;bstrMyString, &clsid&#41;;
    	if &#40;FAILED&#40;hr&#41;&#41;
    	&#123;
    		AfxMessageBox&#40;"Pb CLSIDFromProgID"&#41;;
    		return FALSE;
    	&#125;
       hr = CoCreateInstance&#40; clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, &#40;void**&#41;ptr&#41;;
    
       if &#40;FAILED&#40;hr&#41;&#41; 
       &#123;
    		AfxMessageBox&#40;"Pb CoCreateInstance"&#41;;
    		return FALSE;
       &#125;
    
       return TRUE;
    &#125;
    Merci pour tous ces renseignements.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. Comment faire une interface de ce type....
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/04/2007, 13h50
  2. Tableau dans une interface idl
    Par Polochon2001 dans le forum CORBA
    Réponses: 2
    Dernier message: 14/05/2004, 09h44
  3. [Débutant] Lancer une interface sous éclipse
    Par bonnefr dans le forum SWT/JFace
    Réponses: 11
    Dernier message: 11/05/2004, 15h59
  4. Comment créé une "interface" pour mes programmes??
    Par alcazar dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 09/02/2004, 13h02
  5. portabilité d'une interface
    Par marou dans le forum JBuilder
    Réponses: 4
    Dernier message: 21/03/2003, 08h53

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