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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Interface d'un objet COM avec 1 paramètre (un VARIANT) de trop : qu'écrire dans ce VARIANT pour être ignoré ?
    Bonjour, je vous décris brièvement mon problème pour vous demander s'il existe une solution (peut être très simple ?) pour régler ce problème :

    Voici la description de l'interface que je dois utiliser

    ------------------------------------------------------
    Syntax
    [objSysPos = ]objSysPositions.Item({lngId | lngIndex})

    Description
    Returns a FRCSysPosition from the collection.

    Parts
    objSysPos as FRCSysPosition
    objSysPositions as FRCSysPositions
    lngId as Long
    lngIndex as Long
    ------------------------------------------------------
    La documentation est orientée VB, mais en C++, l'accès à cette propriété se fait via une méthode dont le prototype est

    HRESULT get_Item (VARIANT Id,VARIANT Index, ISysPosition** Position);

    Jusque là pas de souci, en insistant un peu, ce genre de fonction/methode fini toujours par faire ce qu'on lui demande (c à d me renvoyer un FRCSysPosition tout beau tout frais, accessible via le pointeur que je lui passe en paramètre 3), sauf que cette fois, la fonction me renvoie toujours le même HRESULT :

    0x8002000E : Nombre de paramètres non valide.

    En effet la documentation nous dit qu'on peut demander l'accès à un FRCSysPosition par l'ID ou par l'INDEX, mais certainement pas par les deux, d'où l'erreur qui m'est renvoyée.

    D'où ma question :

    Comment utiliser un VARIANT qui pourra être vu par l'objet COM comme un "non paramètre", une non information, en quelque sorte lui passer en paramètre 2 un VARIANT qui veut dire qu'on ne passe rien en paramètre 2 ?

    Étant novice avec l'utilisation de VARIANT, je ne serais pas étonné que la réponse soit très simple, mais je ne la connais pas pour le moment ^^

    Merci d'avance !

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Bonjour et bienvenue sur le forum

    Pourrais-tu préciser le contexte ? (je connais pas ces fonctions)
    Si ta question concerne une bibliothèque ou outil spécifique, tu auras probablement plus de réponses sur un forum adéquate. Tu veux que je déplace la discussion quelque part là : http://www.developpez.net/forums/f7/c-cpp/ ?

    Bon courage

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Bonjour gbdivers et merci pour ta réponse

    En effet j'utilise un objet COM très fermé et peu connu servant à contrôler des positions mécaniques de robots industriels (c'est compliqué ^^ je ne voulais pas vous embêter avec ce détail, car le détail qui me bloque pour le moment me semble purement "programmatoire" si je puis dire !)

    Dans un des exemples en VB (langage que je ne connais malheureusement pas) la propriété "Item" en question est utilisée ainsi :

    Set mobjSysPos = mobjSysPosCol.Item(Index:=mintPosId - 1)

    mobjSysPosCol As FRCSysPositions
    mobjSysPos As FRCSysPosition
    mintPosId As Integer


    (Petite parenthèse, en C++ la méthode ne me renvoie pas le FRCSysPosition, mais un HRESULT. Le FRCSysPosition m'est renvoyé grâce au pointeur que je lui passe en troisième paramètre. Ce détail là ne m'a jamais posé problème, je le souligne juste pour éviter des interrogations à ce sujet)

    En VB, je vois qu'à l'appel de la fonction on peut préciser quel paramètre on envoie, ici "Index" -> Item(Index:= laValeurQuonVeut) en faisant complètement abstraction du paramètre qu'on ne veut pas envoyer ("Id").

    En C++ par contre c'est plus embêtant, la fonction attend de moi que j'en envoie un VARIANT pour Id et un VARIANT pour Item, du coup je voudrais savoir quel VARIANT je dois envoyer pour qu'il soit vu comme un "non paramètre", pour qu'il voit la même chose que lors de l'appel VB montré quelques lignes plus haut

    Si vous avez une idée de comment faire une telle chose avec un VARIANT, je vous en serais très reconnaissant, car je bloque un peu !

    Dans le cas contraire je vous remercie quand même d'avoir pris le temps de me lire

    PS : pour le déplacement du sujet, s'il vous paraît opportun, je suis évidemment tout à fait d'accord !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Trouvé !
    Après avoir premièrement contourné le problème que j'étais incapable de résoudre, est arrivé le jour où j'ai du le résoudre de gré ou de force.

    http://en.wikipedia.org/wiki/Variant_type

    En visual basic, une donnée non décrite est vue comme un VARIANT

    En C++, le Variant équivalent est de type "10", ç a d Missing Argument (ça tombe bien, c'est un non paramètre que je veux envoyer )

    Problème réglé !


    VARIANT Param1;
    VariantInit(&Param1); // initialize the variant
    Param1.vt = VT_BSTR; // set to BSTR string
    Param1.bstrVal = SysAllocString(L"$MNUTOOLNUM");

    VARIANT Param2;
    VariantInit(&Param2); // initialize the variant
    Param2.vt = 10; //cf http://en.wikipedia.org/wiki/Variant_type , le type 10 veut dire "missing arugment"


    hr = objIVars->get_Item(Param1,Param2,&sortie);

    Le C++ me demande 2 paramètres (le troisième est un retour pointeur), l'objet COM me demande l'un ou l'autre mais pas les deux, et comme ça, ça fonctionne !!

    En esperant que ça puisse servir un jour à quelqu'un,

    Bonne route à tous !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    PS : Sur la suite de ma programmation je viens d'appeler une méthode avec paramètres par défaut de type VARIANT : vtMissing. Voila qui devra marcher également

    (pourquoi n'ais-je pas eu l'occasion de les voir plus tôt !)

Discussions similaires

  1. Accès aux objets COM avec Visual C++
    Par gzeus dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 21/09/2008, 03h59
  2. Les objets COM avec Framework 2.0
    Par SOPRA-Eherve dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 06/03/2007, 22h22
  3. Peut on utiliser un objet com avec eclipse
    Par MoiAussi dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 22/09/2006, 15h47
  4. [Virtual Pascal] [Win32] Objets COM - Interface IShellLink
    Par Alcatîz dans le forum Autres IDE
    Réponses: 5
    Dernier message: 27/10/2005, 21h19
  5. Objet COM et interface
    Par pio_forum dans le forum Windows
    Réponses: 7
    Dernier message: 08/11/2004, 17h25

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