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

  7. #7
    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
    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 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
    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 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
    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 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
    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 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
    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 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
    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 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
    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