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