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

Visual C++ Discussion :

UPNP sous Visual c++


Sujet :

Visual C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut UPNP sous Visual c++
    Hello !

    j'ai développé une petite classe en C++ sous Mac OS en utilisant la librairie Upnp de Intel (pour Linux) et ca fonctionne très bien.

    J'arrive sous Windows en me disant : "je n'ai qu'à faire la même chose avec les API de Windows"... j'ai bien trouvé un exemple sur cette page http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx et c'est inexplicablement compliqué (autant que de prononcer le mot inexplicablement) !

    En bref je n'ai aucune erreur et je surtout je n'ai aucun résultat en utilisant l'exemple ci-dessus (je précise que j'y ai ajouté les fonction CoInitialize et CoUninitialize... dans le genre compliqué à écrire aussi... )

    Et voilà je suis un peu coincé là. Je n'ai pas d'erreur de syntaxe et j'ai utilisé le code tel quel. Mais je ne reçois aucun message. En utilisant tcpdump je ne vois même pas partir de requête M-SEARCH. De plus j'utilise parallèlement Upnp Browser qui m'affiche bien des services qu'il a trouvés.

    Je suis sous Windows XP sp3 avec Visual c++ Express 2010 et le SDK 7.1.

    Qu'en pensez-vous ?

    Merci à vous
    Esteban

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 058
    Points : 12 093
    Points
    12 093
    Par défaut
    Si vous trouvez ce code compliqué, passez chef de projet, vous n'êtes pas fait pour le développement.

    Ce code est un wrapper qui n'utilise aucune technologie de simplification, comme ATL, dans un but didactique et pédagogique.(éviter l'effet baguette magique)

    Si vous ne voulez pas voir ce code, c'est simple, mettez le dans une dll et exportez la fonction "FindUPnPDevice", et puis c'est tout.

    Vous passez quoi comme valeur dans le paramètre "TypeURI" de la méthode "FindUPnPDevice" ?

    P.S.: désolé pour la mise en boîte, j'ai eu une rude journée.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Salut ! et... merci pour le troll !

    Je suis très à l'aise avec les codes complexes, mais moins avec la techno COM... Je n'ai pas trouvé de doc assez claire pour m'expliquer le cheminement des appels asynchrones.

    Quoi qu'il en soit dans le TypeURI j'ai mis "upnp:rootdevice".

    Je reçois bien un appel dans la fonction QueryInterface de la classe CUPnpDeviceFinderCallback mais c'est tout.

    En revanche je n'ai pas utilisé le code tel quel. J'ai intégré le code de la fonction FindUpnpDevice dans une fonction à moi, je l'ai entourée de CoInitialize(NULL) et CoUnitialize() et cettte fonction est exécutée dans un thread boost::thread...

    Voilà

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 058
    Points : 12 093
    Points
    12 093
    Par défaut
    Je suis très à l'aise avec les codes complexes, mais moins avec la techno COM
    Moi, je ne suis pas à l'aise avec du code complexe.
    "code complexe" == "mauvais code"

    C'est clair que la technologie COM, c'est un peu "tricky".

    Et là, vous allez voir pourquoi.

    Si vous regardez le code de la fonction "FindUPnPDevice", vous verrez du code spécifique STA.
    STA, pour single-thread appartment, en gros, c'est du code pour application non threadsafe. C'est cohérent avec "CoInitialize(NULL)".
    Le hic, c'est que le code qui est spécifique STA est aussi spécifique à un type de thread qui a une file de message associée. C'est l'appel de GetMessage qui veut cela. Elle ne marche qu'avec ce type de thread.
    Je ne pense pas que votre "boost::thread" est une file de message associée. Vérifiez que BOOST n'ait pas un type de thread correspondant à ce type de thread, mais j'en doute, car c'est très lié à l'OS Windows.

    Si le composant COM correspondant au CLSID "CLSID_UPnPDeviceFinder" n'est que STA aware, vous devez utiliser impérativement un thread avec file de message.
    Si le composant est FTA, vous pouvez utiliser un boost::thread mais il faudra remplacer le code de la fonction "FindUPnPDevice" pour avoir un mécanisme de synchronisation autre que la file de message du thread.

    Pour savoir si un composant COM est STA, MTA ou FTA compliante, il faut voir dans sa documentation, ou, à défaut, dans la base de registre (mais là c'est une autre histoire -> FAQ peut-être)

    P.S.; je crois que des membres de la communauté "developpez" ont mis en place une FAQ pour COM qui est pas mal:
    http://windows.developpez.com/dcom/t1.html

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Points : 132
    Points
    132
    Par défaut
    Ok ok... merci beaucoup pour ces informations qui sont très intéressantes. Cela m'apprend surtout que vu la structure de mon programme je n'ai à peu près aucune chance d'utiliser COM pour uPNP... Du coup je vais compiler la librairie libupnp sous Windows et ca sera beaucoup plus cohérent avec le reste de mon architecture. J'aurai moins de code spécifique à Windows.

    Merci encore !

Discussions similaires

  1. [MSChart] creation de courbe sous visual C++
    Par gabriel knight dans le forum MFC
    Réponses: 5
    Dernier message: 18/09/2006, 15h32
  2. Impression sous visual c++
    Par zeze511 dans le forum MFC
    Réponses: 2
    Dernier message: 16/02/2004, 13h02
  3. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 20h52
  4. Réponses: 3
    Dernier message: 28/01/2004, 11h46
  5. Deplacer un curseur dans un RichEdit sous visual c
    Par tweek dans le forum Windows
    Réponses: 7
    Dernier message: 14/01/2004, 01h29

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