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++

  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 395
    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 395
    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 395
    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 395
    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 ? ^^

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Déjà, quand je vois un cast C-style en BSTR, je trouve ça suspect.

    Puis-je voir les déclarations C++ de AddFile() et raw_AddFile() ?

    Je ne sais plus dans quelles circonstances ont voit les méthodes raw... Comment as-tu importé la bibliothèque de types ? Avec #import ?
    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.

  8. #8
    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
    Oui j'ai un #import de NeroVisionAPI.dll.

    Pour la déclaration des méthodes et l'utilisation des raw je pense qu'en te copiant ça, ça devrait aller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    inline IFileInfoPtr IMediaAnalyzer::AddFile ( _bstr_t filepath ) {
        struct IFileInfo * _result = 0;
        HRESULT _hr = raw_AddFile(filepath, &_result);
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return IFileInfoPtr(_result, false);
    .. du coup je suis en train d'essayer d'utiliser les méthodes sans les raw et de simplement récupérer le nombre de segments de mon fichier pour commencer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    IMediaAnalyzer *pAnalyzer = NULL;
    IFileInfo * fileInfo = NULL;
    HRESULT hr = CoCreateInstance(__uuidof(MediaAnalyzer), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMediaAnalyzer), (void**)&pAnalyzer);
    if(SUCCEEDED(hr))
    {
    	fileInfo = pAnalyzer->AddFile((BSTR)psPath);	
    	IProgressCallback* pCallback;
    	HRESULT hr2 = CoCreateInstance(__uuidof(IProgressCallback), NULL, CLSCTX_LOCAL_SERVER, __uuidof(IProgressCallback), (void**)&pCallback);
    	if(SUCCEEDED(hr2))
    	{
    		pAnalyzer->AnalyzeFiles(pCallback);
                     pCallback->Release(); 
    	}
    	pAnalyzer->Release();
    }
     
    int numSeg=-1;
    numSeg=fileInfo->GetNumSegments();
    Pour l'instant, je ne rentre jamais dans le 2e if quel que soit le "3e argument". Du coup l'appel de GetNumSegments() plante. Les informations sur la vidéo ne sont sans doute pas encore bien récupérées.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Un ID d'interface n'est pas la même chose qu'un ID de classe.
    S'il n'existe pas de classe ProgressCallback, cela veut dire qu'une IProgressCallback ne s'utilise pas ainsi.

    PS: Puisque tu as accès à des pointeurs intelligents, je te conseille de les utiliser jusqu'au bout: Utilise directement un IMediaAnalyzerPtr (qui posséde d'ailleurs sa propre fonction membre CreateInstance(), à laquelle tu peux passer __uuidof(MediaAnalyzer)), un IFileInfoPtr, etc.
    Sans toucher aux méthodes RAW, cela te permettra de ne plus avoir à te soucier du comptage de références ou des HRESULT (vu qu'en cas d'échec, tu auras une exception à la place dans la plupart des cas).
    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.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IMediaAnalyzerPtr spAnalyzer;
    IFileInfoPtr spFileInfo;
    HRESULT hr = spAnalyzer.CreateInstance(__uuidof(MediaAnalyzer), NULL, CLSCTX_INPROC_SERVER);
    if(SUCCEEDED(hr))
    {
    	spFileInfo = spAnalyzer->AddFile(psPath);	 //Laisse le constructeur de _bstr_t s'occuper des conversions pour toi
     
    	//Euh...
    }
     
    int numSeg = -1;
    numSeg = spFileInfo->GetNumSegments();
    Euh... Pour ce qui est de la callback, j'ai l'impression qu'en fait, c'est à toi de l'implémenter: Tu dois faire ton propre objet COM implémentant l'interface IProgressCallback...
    Ou bien, peut-être que la méthode accepte que tu lui passes tout simplement NULL...
    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.

  11. #11
    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 repris ton code modifié. En passant le Callback à NULL, ça plante. En l'enlevant, j'arrive à utiliser la méthode GetNumSegment qui me dit que ma vidéo contient 0 segment. Du coup ça plante quand ensuite j'essaye d'appeler la méthode GetSegment sur le 1e segment. C'est plutôt logique mais par contre ça veut dire que ma vidéo n'est toujours pas bien chargée.

    Je vais donc essayer d'implémenter moi-même ce qu'il faut pour l'interface IProgressCallback...

    Merci pour ton aide.

  12. #12
    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
    Alors,

    J'ai repris ce qui était fait dans une autre classe sur IProgressCallback. Du coup j'ai rajouté entre autre dans la classe où je travaille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    STDMETHOD (QueryInterface) (/* [in] */ REFIID riid, /* [iid_is][out] */ void ** ppvObject)
    	{
    		if (riid == IID_IUnknown ||
    			riid == __uuidof (IProgressCallback))
    		{
    			*ppvObject = this;
    			return S_OK;
    		}
    		else
    		{
    			*ppvObject = NULL;
    			return E_NOINTERFACE;
    		}
    	}
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IProgressCallbackPtr spCallback = NULL;
    QueryInterface(__uuidof(IProgressCallback),(LPVOID *) &spCallback);
    spAnalyzer->AnalyzeFiles(spCallback);
    Pas de problème jusqu'à ce que j'arrive à AnalyzeFiles(spCallback) et plus précisément HRESULT _hr = raw_AnalyzeFiles(pCallback, &_result); où j'ai à nouveau du :
    Exception non gérée à 0x0043c51e dans NVAPIExample.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000020.
    Chuis pas sur la bonne voie ?

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Je ne vois pas l'appel à AddRef() dans ton implémentation de QueryInterface()...
    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.

  14. #14
    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
    Les méthodes AddRef et Release que j'ai reprises ne font rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	STDMETHOD_(ULONG, AddRef) (void)
    	{
    		return 0;
    	}
    	STDMETHOD_(ULONG, Release) (void)
    	{
    		return 0;
    	}
    Il faut que je les modifie ? Ou juste que j'appelle AddRef dans QueryInterface !? (je veux bien mais ça va pas changer grand chose...)

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    AddRef ne doit jamais retourner zéro, et Release ne doit retourner zéro que quand l'appel à Release() détruit l'objet.
    C'est un comptage de références intrusif.

    PS: La classe en question hérite bien de IProgressCallback, au moins?
    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.

  16. #16
    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
    Citation Envoyé par Médinoc Voir le message
    PS: La classe en question hérite bien de IProgressCallback, au moins?
    Oui.
    Citation Envoyé par Médinoc Voir le message
    AddRef ne doit jamais retourner zéro, et Release ne doit retourner zéro que quand l'appel à Release() détruit l'objet.
    Alors le code de l'exemple d'application de NeroVisionAPI fourni dans le SDK de Nero est bancal...

  17. #17
    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
    .. Et si je veux quand même faire comme pour IMediaAnalyzer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spCallback.CreateInstance(__uuidof(ProgressCallback), NULL, CLSCTX_INPROC_SERVER);
    Il me faut créer un type ProgressCallback. Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct __declspec(uuid("???")) ProgressCallback;
    Mais comment obtenir un identifiant unique ?

  18. #18
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ne l'utilise pas avec CreateInstance : Tous les objets COM ne sont pas instanciables avec, et ton callback n'en a pas besoin.

    Tu peux directement faire ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IProgressCallbackPtr spCallback(new ProgressCallback, false);
     
    //ou
     
    IProgressCallbackPtr spCallback(new ProgressCallback(parametres_donc_la_callback_a_besoin), false);

    PS:
    N'oublie pas que le compteur de références doit être initialisé à 1 dans ton constructeur, pas à zéro.
    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.

  19. #19
    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
    En fait je ne sais vraiment pas où et comment créer la structure ou la classe ProgressCallback. Les déclarations IMediaAnalyzer et IProgressCallback que je peux voir sont dans des fichiers .tli et .tlh générés par le compilateur à partir de NeroVisionAPI.dll.

    Pour MediaAnalyzer il y a en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct __declspec(uuid("aef4e74f-7767-4fed-b4a8-2f9a0a713d26"))
    MediaAnalyzer;
    Mais je ne peux pas rajouter la même chose pour un ProgressCallback. Je ne suis pas sensé éditer ces fichiers. Donc il me faut quoi ? Une classe dans mon code qui implémente IProgressCallback ?

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Oui.

    Voici un squelette de classe COM simple: Une seule interface, pas d'ID de classe. Instanciée par un simple new.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    class CMyProgressCallback : public IProgressCallback
    {
    	LONG m_cRefs;
    public:
    	CMyProgressCallback(void) : m_cRefs(1) {}
     
    	/* IUnknown members */
    	STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv); /*pas de PURE cette fois-ci*/
    	STDMETHOD_(ULONG, AddRef)(THIS)
    	{
    		InterlockedIncrement(&m_cRefs);
    		return m_cRefs;
    	}
    	STDMETHOD_(ULONG, Release)(THIS)
    	{
    		InterlockedDecrement(&m_cRefs);
    		ULONG ret = m_cRefs;
    		if(m_cRefs == 0)
    		{
    			m_cRefs = 42;
    			delete this;
    		}
    		return ret;
    	}
     
    	/* IProgressCallback members */
    	/* NOTE: Je n'ai aucune idée des fonctions de IProgressCallback, 
    	   impossible de trouver quoi que ce soit sur le web */
    };
     
    /* IUnknown members */
     
    STDMETHODIMP CMyProgressCallback::QueryInterface(REFIID riid, void **ppv)
    {
    	if(ppv == NULL)
    		return E_POINTER;
    	if(riid == __uuidof(IUnknown))
    	{
    		IUnknown *pIface = this;
    		*ppv = pIface;
    	}
    	else if(riid == __uuidof(IProgressCallback))
    	{
    		IProgressCallback *pIface = this;
    		*ppv = pIface;
    	}
    	else
    	{
    		*ppv = NULL;
    		return E_NOINTERFACE;
    	}
     
    	IUnknown pUnkRet = *ppv;
    	pUnkRet->AddRef();
    	return S_OK;
    }
     
    /* IProgressCallback members */
    /* ... */
    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.

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