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 :

Directshow & Visual Studio 8 : erreur dans la compilation


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut Directshow & Visual Studio 8 : erreur dans la compilation
    Bonjour,

    je suis en train de travailler sur un projet en C ou je souhaite lire le flux video d'une camera sous windows.

    J'ai donc cree un projet VS (avec CMake), et code une fonction de lecture video.
    Je me trouve alors devant des erreurs de compilation abherente. En voici quelques exemples :
    pour le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       HRESULT hr;
       ICreateDevEnum *pDevEnum =NULL;
       IEnumMoniker *pVideoInputEnum = NULL;
        
       hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
                              IID_ICreateDevEnum, (void **) &pDevEnum);
       hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pVideoInputEnum, 0);
    J'ai :
    ..\..\src\video_directshow.c(92) : error C2440: 'function' : cannot convert from 'const GUID' to 'const IID *const '
    ..\..\src\video_directshow.c(92) : warning C4024: 'CoCreateInstance' : different types for formal and actual parameter 1
    ..\..\src\video_directshow.c(93) : error C2440: 'function' : cannot convert from 'const IID' to 'const IID *const '
    ..\..\src\video_directshow.c(93) : warning C4024: 'CoCreateInstance' : different types for formal and actual parameter 4



    Puis un peu plus loin :
    ..\..\src\video_directshow.c(99) : error C2039: 'CreateClassEnumerator' : is not a member of 'ICreateDevEnum'

    Pourtant cette methode appartient bien a cette structure.

    J'ai code mon code a partir d'exemples trouves sur internet et avec DXSDK.

    J'ai rajoute mon code dans un projet directshow existant (dans les exemples livres avec les lib directx) et il compile.
    J'ai essaye de regarder les differences dans les proprietes entre les 2 projets et je ne vois rien de significativement different.

    Quelles sont les causes de ces erreurs de compilation ?
    Si vous avez besoin d'autres informations, n'hesitez pas a demander

    Merci

  2. #2
    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 518
    Points
    41 518
    Par défaut
    Tu cherches à utiliser la syntaxe C++ de COM alors que tu es en C.
    La même chose en C (à vu de nez) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     HRESULT hr;
       ICreateDevEnum *pDevEnum =NULL;
       IEnumMoniker *pVideoInputEnum = NULL;
     
       hr = CoCreateInstance (&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
                              &IID_ICreateDevEnum, (void **) &pDevEnum);
       hr = pDevEnum->lpVtbl->CreateClassEnumerator(pDevEnum, &CLSID_VideoInputDeviceCategory, &pVideoInputEnum, 0);
    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.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut
    Effectivement, ca resoud mon premier probleme. J'avais pas vu que la syntaxe C et C++ de COM etait differente.

    Merci beaucoup

    Il me reste maintenat a investiguer les problemes :
    ..\..\src\video_directshow.c(99) : error C2039: 'CreateClassEnumerator' : is not a member of 'ICreateDevEnum'
    ..\..\src\video_directshow.c(113) : error C2039: 'Next' : is not a member of 'IEnumMoniker'
    ...


    Il est possible que ce soit aussi a cause de la syntaxe C/C++.
    Mais alors quel est l'equivalent en C de ces methodes ?

  4. #4
    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 518
    Points
    41 518
    Par défaut
    pareil.
    La principale transformation à faire, c'est ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IUneInterface *pIface = ... ;
    pIface->UneFonction(...);
    devient:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IUneInterface *pIface = ... ;
    pIface->lpVtbl->UneFonction(pIface, ...);

    Et le reste des modifs, c'est qu'en C il faut explicitement mettre un & pour les REFCLSID et les REFIID...
    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
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut
    Exact, directshow a aussi defini des macros ca. Je les ai trouve dans le fichier ou sont definis ICreateDevEnum (strmif.h).

    en C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ICreateDevEnum *pDevEnum =NULL;
    IEnumMoniker *pVideoInputEnum = NULL;
    pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pVideoInputEnum, 0);
    en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ICreateDevEnum *pDevEnum =NULL;
    IEnumMoniker *pVideoInputEnum = NULL;
    
    ICreateDevEnum_CreateClassEnumerator(pDevEnum,CLSID_VideoInputDeviceCategory, &pVideoInputEnum, 0);
    //ou
    pDevEnum->lpVtbl->CreateClassEnumerator(pDevEnum,CLSID_VideoInputDeviceCategory, &pVideoInputEnum, 0);
    Et ca marche pour toutes les fonctions Directshow, dommage qu'aucune doc n'en parle, ca m'aurait evite de perdre du temps .

    Merci pour ton aide

  6. #6
    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 518
    Points
    41 518
    Par défaut
    Ce n'est pas lié à DirectShow, c'est la base de COM en C.
    Normalement, la technique du lpVtbl doit toujours marcher, conformément à la macro DECLARE_INTERFACE() en C.

    Les macros elles, ne marcheront pas toujours: Elles ne sont définies que si l'interface provient d'un fichier .idl, pas si elles sont déclarées avec DECLARE_INTERFACE()...
    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.

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

Discussions similaires

  1. [Visual Studio 2005] Erreur de compli
    Par Nico28 dans le forum Visual C++
    Réponses: 8
    Dernier message: 11/12/2012, 12h37
  2. Réponses: 0
    Dernier message: 06/04/2010, 00h53
  3. Compilation sous Visual Studio 2008 : erreur QtBuild
    Par jackk dans le forum Débuter
    Réponses: 1
    Dernier message: 20/01/2010, 12h46
  4. Apllication Visual Studio 2005 : Erreur de permission
    Par Nicolas2812 dans le forum Visual C++
    Réponses: 3
    Dernier message: 01/03/2007, 19h03
  5. Visual Studio 2005 : erreur C2668
    Par Patriarch24 dans le forum MFC
    Réponses: 2
    Dernier message: 26/04/2006, 17h34

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