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

C++ Discussion :

Utilisation de QueryInterface


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sly078
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut Utilisation de QueryInterface
    Bonjour,

    J'essaye d'utiliser le SDK de Nero (plus spécifiquement NeroVisionAPI) sous Visual C++. Je cherche à avoir accès aux méthodes de différentes interfaces dont la première est IMediaAnalyzer. Je ne sais pas comment me servir d'une "instance" de cette interface .. je ne sais pas comment l'initialiser.

    La seule interface dont IMediaAnalyzer hérite est IUnKnown. Est-il possible d'utiliser la méthode QueryInterface à partir de cette interface ? Cela donnerait quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IMediaAnalyzer *mediaAnalyzer = NULL;
    IUnknown * pUnKnown;
    pUnKnown->QueryInterface(__uuidof(IMediaAnalyzer),(LPVOID *) &mediaAnalyzer);
    IFileInfo ** fileInfo = NULL;
    mediaAnalyzer->raw_AddFile((BSTR)psPath,fileInfo);
    Sauf que je ne sait pas comment initialiser pUnKnown.

    Ou alors, dans la classe dans laquelle j'écris, je peux avoir accès à un pointeur (m_pProject) sur une autre interface (IProject .. mais IMediaAnalyzer n'en hérite pas). Je pourrais donc faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (GetPageData ()->m_pProject)->QueryInterface(__uuidof(IMediaAnalyzer),(LPVOID *) &mediaAnalyzer);
    Je n'ai pas de problème à la compilation, mais à l'exécution mediaAnalyzer est toujours NULL. J'ai beau avoir lu le sujet http://www.developpez.net/forums/d25...-ligne-code/#4 et d'autres choses, je ne vois pas comment je peux utiliser correctement la méthode QueryInterface ou comment initialiser correctement mon mediaAnalyzer.

    Quelqu'un est-il capable d'éclairer ma lante un peu terne ?

    Merci,

    Sly

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Cela est sans doute marqué dans la doc de l'API de Nero. Soit tu dois appeler une fonction particulière d'une bibliothèque de Nero (ou une méthode d'une autre interface COM de Nero) pour obtenir un pointeur vers l'objet désiré, soit tu peux le créer directement avec CoCreateInstance().

    Pour le savoir, regarde s'il y a un type d'objet COM que tu dois récupérer et qui implémente l'interface, puis regarde si un CLSID lui est associé. S'il a un CLSID, alors tu peux créer un objet COM de ce type avec CoCreateInstance().
    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 confirmé Avatar de sly078
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut
    Malheureusement, l'API de Nero n'est pour ainsi dire plus supportée par Nero et le documentation n'est pas vraiment complète. Les seules infos que donne la doc (de NeroVisionAPI puisque c'est de ça que je parle) sur l'interface IMediaAnalyzer sont :

    7.11 IMediaAnalyzer Interface
    Interface for analyzing one or more media files.

    7.11.1 IMediaAnalyzer::AddFile Method
    Add a file to be analyzed. The resulting IFileInfo is filled after calling AnalyzeFiles().
    HRESULT AddFile([in] BSTR filepath, [out, retval] IFileInfo** fileInfo);

    7.11.2 IMediaAnalyzer::AnalyzeFiles Method
    Analyzes all files previously added by AddFile().
    HRESULT AnalyzeFiles([in] IProgressCallback* pCallback, [out, retval] boolean*pbSuccess);
    et

    A Media analyzer object.
    coclass MediaAnalyzer
    {
    [default] interface IMediaAnalyzer;
    };
    Je veux me servir de ces méthodes pour avoir accès au pointeur de l'interface IFileInfo.

    Dans le code de l'exemple d'application que j'essaye d'adapter à mon besoin, il n'y a aucune référence à un CLSID ou d'utilisation de CoCreateInstance(). Par contre l'application utilise des UUID et des constructeurs quand ils existent.

    Par exemple, pour l'interface IProject on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EVAL_HR (m_pProject.CreateInstance (__uuidof (NeroVisionAPI::Project)));
    Et pour l'interface IContentResolver la classe ContentResolver est implémentée et on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NeroVisionAPI::IContentResolver* resolver = new ContentResolver;
    Mais dans le code de l'API pour IMEdiaAnalyzer il n'y a ni construsteur ni méthode pour créer une instant mais juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct __declspec(uuid("9cc2383f-485f-4593-983d-4686da5ca265"))
    IMediaAnalyzer : IUnknown
    {
        ...
    };
     
    struct __declspec(uuid("aef4e74f-7767-4fed-b4a8-2f9a0a713d26"))
    MediaAnalyzer;
    A aucun endroit je ne vois d'indication sur une méthode permettant d'accèder à un pointeur de IMediaAnalyzer. Dois-je faire quelque chose avec ce MediaAnalyzer ? mais quoi ?

    En tout cas merci de ta réponse Médinoc

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IMediaAnalyzer *pAnalyzer = NULL;
    HRESULT hr = CoCreateInstance(__uuidof(MediaAnalyzer), NULL, ???, __uuidof(IMediaAnalyzer), (void**)&pAnalyzer);
    if(SUCCEEDED(hr))
    {
    	//Jouer avec
    	//...
     
    	pAnalyzer->Release(), pAnalyzer = NULL;
    }
    Par contre, je ne connais pas assez Nero pour savoir ce qu'il faut mettre en troisième paramètre: CLSCTX_INPROC_SERVER ou CLSCTX_LOCAL_SERVER ?
    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 confirmé Avatar de sly078
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut
    J'ai essayé avec les deux. Avec CLSCTX_LOCAL_SERVER je ne rentre pas dans le if. Avec CLSCTX_INPROC_SERVER j'y rentre donc pAnalyser est bien initialisé. Par contre j'ai toujours la même erreur lorsque j'appelle ma méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pAnalyzer->raw_AddFile((BSTR)psPath,fileInfo);
    C'est-à-dire :

    Exception non gérée à 0x02b2d5d7 dans NVAPIExample.exe*: 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00000000.
    Peut-être que l'erreur vient de fileInfo et non de pAnalyzer ?_?

  6. #6
    Membre confirmé Avatar de sly078
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut
    Bon .. ya quand même un peu de mieux. J'explique un peu plus où je veux en venir. Mon but est de récupérer une image d'une vidéo avec l'API de NeroVision.

    Pour cela, il existe la méthode GetImage() de l'interface IMediaInfo :
    IMediaInfo::GetImage Method
    Retrieves a frame of the media at a given position.
    HRESULT GetImage([in] double posSec, [out, retval] long* hDIB);
    Pour avoir accès à un objet correctement instancié de IMediaInfo, je veux utiliser :
    IFileInfo::GetSegmentMediaInfo Method
    Gets the MediaInfo for one segment of the file.
    HRESULT GetSegmentMediaInfo([in] int segIndex, [out, retval] IMediaInfo**
    pMediaInfo);
    Et pour avoir un objet correctement instancié de IFileInfo je veux utiliser la méthode AddFile dont j'ai déjà parlé où le fichier que je rajoute est la vidéo qui m'intéresse.

    Mon programme plante en appelant la méthode raw_AddFile qui prend en argument le fichier et fileInfo. Par contre la méthode AddFile, elle, ne plante pas mais ne prend en argument que mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pAnalyzer->AddFile((BSTR)psPath);
    D'après la doc il faudrait également que j'appelle la méthode AnalyzeFiles pour remplir mon fileInfo. Sauf que du coup je n'ai plus de fileInfo... Et qui plus est, cette méthode prend en argument un pointeur vers une autre interface (IProgressCallback) que j'ai créé avec CoCreateInstance mais que je ne sais pas utiliser...

    @Médinoc : tu me réponds juste histoire de me dire que tu peux rien faire de plus pour moi ? ^^

Discussions similaires

  1. utilisation de QueryInterface
    Par cyreel dans le forum Visual C++
    Réponses: 2
    Dernier message: 16/01/2007, 14h18
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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