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 :

Bluetooth OBEX pour Windows Mobile : se connecter connaissant la cible


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 22
    Points
    22
    Par défaut Bluetooth OBEX pour Windows Mobile : se connecter connaissant la cible
    Bonjour,

    Je travaille actuellement sur l'implémentation d'un OBEX put afin de transférer un fichier d'un device à un autre en bluetooth.

    Voici la marche à suivre habituelle lorsque l'on souhaite scanner les devices nous entourant afin de sélectionner celui qui nous intéresse pour enfin lui transférer le fichier.

    IObex::Initialize() -> initialise l'object Obex
    IObex::EnumDevices() -> liste les devices accessibles
    IHeaderCollection interface -> construction des en-tête à envoyer
    IObexDevice::Connect() -> se connecter au device que l'on souhaite

    http://msdn2.microsoft.com/en-us/library/ms881927.aspx

    Cependant, pour ma part, je ne souhaite pas lister les devices pour en choisir un mais je me place dans le cadre ou je connais l'adresse, le nom du device auquel je veux me connecter.
    J'ai donc choisi d'utiliser "BindToDevice" pour binder l'adresse à l'objet IObex à la place de "IObex::EnumDevices()" avant d'exécuter le IObexDevice::Connect() .

    IObex::BindToDevice(IPropertyBag* pPropertyBag, IObexDevice** ppDevice)

    Mon problème est que je ne peux pas instancier de IPropertyBag pour le remplir avant de faire le "BindToDevice".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IPropertyBag PropertyBag;
    VARIANT v; 
    VariantInit(&v); 
    v.bstrVal = SysAllocString(L"P535");
    PropertyBag.Write(L"Name", &v);
    err = pObex->BindToDevice(&PropertyBag, &pObexDevice); // This method should be used if device enumeration is done outside of the OBEX interfaces.
    L'erreur retournée est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    error C2259: 'IPropertyBag' : cannot instantiate abstract class
            due to following members:
            'HRESULT IUnknown::QueryInterface(const IID &,void **)' : is abstract
            c:\program files\windows mobile 6 sdk\pocketpc\include\armv4i\unknwn.h(111) : see declaration of 'IUnknown::QueryInterface'
            'ULONG IUnknown::AddRef(void)' : is abstract
            c:\program files\windows mobile 6 sdk\pocketpc\include\armv4i\unknwn.h(115) : see declaration of 'IUnknown::AddRef'
            'ULONG IUnknown::Release(void)' : is abstract
            c:\program files\windows mobile 6 sdk\pocketpc\include\armv4i\unknwn.h(117) : see declaration of 'IUnknown::Release'
            'HRESULT IPropertyBag::Read(LPCOLESTR,VARIANT *,IErrorLog *)' : is abstract
            C:\Program Files\Windows Mobile 6 SDK\PocketPC\include\ARMV4I\ocidl.h(7744) : see declaration of 'IPropertyBag::Read'
            'HRESULT IPropertyBag::Write(LPCOLESTR,VARIANT *)' : is abstract
            C:\Program Files\Windows Mobile 6 SDK\PocketPC\include\ARMV4I\ocidl.h(7749) : see declaration of 'IPropertyBag::Write'
    Mes questions sont les suivantes:
    - est ce que je m'y prends bien ? est-ce la bonne méthode pour utiliser OBEX connaissant la cible ?
    - si oui, comment instancier un IPropertyBag ?

    Je vous remercie par avance.

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Tout objet COM s'instancie avec CoCreateInstance , il n'y a pas d'autre méthode.
    IPropertyBag est un objet COM avec les 4 interfaces classiques d'IUnknow.
    D'ailleurs dans la culture Microsoft les objets COM commencent pour la plupart par IQuelquechose.
    Donc il faut appeler CoCreateInstance avec les identifiants d'interfaces appropriés.
    Par exemple l'appel sera:
    IPropertyBag PropertyBag;
    CoCreateInstance( CLSID_CPropertyBagLib, NULL, CLSCTX_INPROC_SERVER, IID_ICPropertyBagLib, (LPVOID*)&PropertyBag );

    Regarder dans OCIDL.H pour les identifiants

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Tout objet COM s'instancie avec CoCreateInstance ,
    ...Ou se récupère à partir d'un autre objet COM.

    Sans compter des objets COM spéficiques qui sont retournés uniquement par certaines fonctions de Windows (comme le Free-Threaded Marshaller)...
    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.

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Tout objet COM s'instancie avec CoCreateInstance , il n'y a pas d'autre méthode.
    IPropertyBag est un objet COM avec les 4 interfaces classiques d'IUnknow.
    D'ailleurs dans la culture Microsoft les objets COM commencent pour la plupart par IQuelquechose.
    Donc il faut appeler CoCreateInstance avec les identifiants d'interfaces appropriés.
    Par exemple l'appel sera:
    IPropertyBag PropertyBag;
    CoCreateInstance( CLSID_CPropertyBagLib, NULL, CLSCTX_INPROC_SERVER, IID_ICPropertyBagLib, (LPVOID*)&PropertyBag );

    Regarder dans OCIDL.H pour les identifiants
    Merci beaucoup Mat.M pour cette explication très clarifiante.

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

Discussions similaires

  1. Débuter un programme Delphi 2007 pour Windows Mobile 6
    Par arnaudG dans le forum Delphi .NET
    Réponses: 7
    Dernier message: 31/01/2008, 18h29
  2. Réponses: 16
    Dernier message: 06/06/2007, 18h49
  3. langues pour windows mobile 2003 SE
    Par vinceLeBarbare dans le forum Windows
    Réponses: 1
    Dernier message: 14/03/2007, 14h02
  4. Développez pour Windows Mobile "GRATUITEMENT"
    Par Argonz dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 05/03/2007, 14h57

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