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

Visual C++ Discussion :

IUnknown::Release sur un composant COM


Sujet :

Visual C++

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut IUnknown::Release sur un composant COM
    Bonjour à tous,

    Je tourne en rond sur cette phrase du MSDN:

    IVssBackupComponents is released by calling IUnknown::Release

    Alors je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <CComPtr> IVssBackupComponents pBackupComponent::Release;
    Et du coup j'ai les erreurs suivantes;

    error C2143: erreur de syntaxe*: absence de ';' avant '<'
    error C2510: 'pBackupComponent'*: class/struct/union doit figurer à gauche de '::'
    Etant donné que msdn demande de libérer une interface, pourquoi ce qui est à gauche de ::Release doit être autre chose qu'une interface COM?

    D'avance merci pour toute pistes

    PS: Pour ceux que ça intéresserait, le code source est là. Le but est de sauvegarder et restaurer des fichiers avec les shadow copy sous XP et au delà. Ce n'est pas encore fini, et je ne sais pas encore si ça fonctionne.

    http://www.raysa.org/~lgele/VssSaveRestore1

  2. #2
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    J'avais aussi essayé ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pBackupComponent->Release();
    Mais ça semblait pire:

    error C2248: 'ATL::_NoAddRefReleaseOnCComPtr<T>::Release'*: impossible d'accéder à private membre déclaré(e) dans la classe 'ATL::_NoAddRefReleaseOnCComPtr<T>'
    1> with
    1> [
    1> T=IVssBackupComponents
    1> ]
    1> c:\program files\microsoft sdks\windows\v6.0a\include\atlbase.h(662)*: voir la déclaration de 'ATL::_NoAddRefReleaseOnCComPtr<T>::Release'
    1> with
    1> [
    1> T=IVssBackupComponents
    1> ]
    D'après ce que j'ai trouvé (un peu en Russe, j'ai du mal, mais bon) faut faire un CoInitialize, mais j'ai déja fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    Par contre à aucun moment de mon code je n'ai fait de QueryInterface.

    Quelqu'un a-t-il déja eu le problème?

    D'avance merci

  3. #3
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    ça y est, j'ai trouvé, je ne sais pas si c'est propre, mais ça compile.

    J'ai remplacé ça:

    CComPtr<IVssBackupComponents> pBackupComponent;

    par ça:

    IUnknown* pBackupComponent;

    et ce genre de truc:

    pBackupComponent->InitializeForBackup(pbstrXML);

    par ça:

    hr=((IVssBackupComponents*)pBackupComponent)->InitializeForBackup(pbstrXML);

    Du coup, maintenant je peux faire un releazse sur pBackupComponent

    pBackupComponent->Release();

    et ça compile.

    Si quelqu'un à une explication, je suis preneur...

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    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 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Tu aurais du garder le CComPtr: C'est une classe RAII, donc elle fait le Release() toute seule dans son destructeur...

  5. #5
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Salut Medinoc,

    Merci de ta précision, je vais faire quelques recherche, car là, je n'y comprends plus rien...

  6. #6
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Ha ben d'accord, je recorrige mon code et j'oublie le Release, apparemment, ça se fait tout seul, un peu comme en java avec son garbage collector

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    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 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Citation Envoyé par scolyo Voir le message
    un peu comme en java avec son garbage collector
    Non.

    Ce qui est un peu (mais pas exactement) comme le garbage collectore, c'est que le dernier Release() détruit l'objet (comptage de références). Le fait que le Release() soit fait automatiquement, est une spécificité du C++, les destructeurs de classe.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    D'accord, désolé de la méprise, mais c'était la comparaison qu'il y avait dans une doc.

    Encore merci, j'ai corrigé mon code, mais pas encore uploader, j'ai des erreurs que je n'arrive pas à corriger sur des manipulations de WCHAR.

    Mais je ne perds pas espoir

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

Discussions similaires

  1. doc sur composants COM (ActiveX)
    Par tubaas dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/12/2009, 17h31
  2. Composant COM sur achitecture n-tier
    Par inluvwitiou dans le forum ASP
    Réponses: 3
    Dernier message: 11/02/2008, 14h46
  3. Détecter la présence d'un composant COM sur le système ?
    Par Vince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/12/2006, 10h07
  4. lire/écrire sur un port com sans le monopoliser
    Par totofweb dans le forum Windows
    Réponses: 4
    Dernier message: 26/07/2004, 13h23
  5. Composant COM et style XP
    Par Reisubar dans le forum Composants VCL
    Réponses: 7
    Dernier message: 10/11/2003, 19h23

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