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

Langage Delphi Discussion :

[D7] Acess Violation


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut [D7] Acess Violation
    Bonjour,

    j'ai crée une nouvelle fonction dans MMDevApi.pas :

    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
    19
    { ==================================================================== }
    Function Volume(Var Mute : Boolean ; Var Vol : Integer ) : Boolean ;
    Var
      endpointVolume: IAudioEndpointVolume;
      VolumeLevel: Single;
      deviceEnumerator: IMMDeviceEnumerator;
      defaultDevice: IMMDevice;
    begin
      Result := False ;
      CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
      deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
      defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
      if endpointVolume = nil then Exit;
      Result := True ;
      endpointVolume.GetMasterVolumeLevelScaler(VolumeLevel);
      Vol := Round(VolumeLevel * 100) ;
      endpointVolume.GetMute(Mute)  ;
    End ;  
    { ==================================================================== }
    voici l'unité complète :

    MMDevApi.zip

    je l'utilise comme ceci :

    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
    19
    Uses MMDevApi
    ...
    { ========================================================================== }
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Mute : Boolean ;
      Vol : Integer ;
      Mess : String ;
    begin
     If Volume(Mute, Vol) Then
        Begin
          Mess := 'Son On  -  Volume : ' ;
          If Mute Then  Mess := 'Son Off  -  Volume : ' ;
          ShowMessage(Mess+ IntToStr(Vol)+' %' );
        End
      Else
        ShowMessage('Erreur d''ouverture du média son') ;     
    end;
    { ========================================================================== }
    la fonction Volume fonctionne, le message s'affiche bienmais à la sortie de Button1Click j'ai un Acess Violation avec Read of Adress 0x00000000

    Je ne comprends pas pourquoi ?

    Merci de m'éclairer
    A+
    Charly

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Interface à nil mal libérée ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour Shai,

    oui, je pense que c'est ça, mais je ne sais pas quoi libérer (j'ai essayé des free ou des release sur un peu tout sans que ça compile)

    A+
    Charly

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Le problème cela ressemble à un objet à nil relibéré
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Oui, mais je ne libère rien du tout !
    je vais regarder de plus près
    A+
    Charly

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    ça y est, j'ai trouvé : c'était la fonction GetMute qui faisait planter. GetMute n'accepte pas la variable Mute passé en paramètre Var de la fonction Volume !
    avec la variable locale intermédiaire bMute ça passe !
    voici les modifs :

    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
    19
    20
    21
    { ==================================================================== }
    Function Volume(Var Mute : Boolean ; Var Vol : Integer ) : Boolean ;
    Var
      endpointVolume: IAudioEndpointVolume;
      VolumeLevel: Single;
      deviceEnumerator: IMMDeviceEnumerator;
      defaultDevice: IMMDevice;
      bMute : Boolean ;
    begin
      Result := False ;
      CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
      deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
      defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
      if endpointVolume = nil then Exit;:mouarf:
      Result := True ;
      endpointVolume.GetMasterVolumeLevelScaler(VolumeLevel);
      Vol := Round(VolumeLevel * 100) ;
      endpointVolume.GetMute(bMute)  ;
      Mute := bMute ;
    End ;
    { ==================================================================== }
    Je n'ai pas compris pourquoi ? si jamais ShaiLeTroll ou Andnotor ont l'explication ? (je lance le défi du jour )

    et aussi, Paul, Sergio, Anapurna, Cirec, Tourlourou, et tous les autres ...

    A+
    Charly

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 700
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 700
    Points : 13 145
    Points
    13 145
    Par défaut
    A mon avis

    Le compilateur fait sont possible pour convertir une variable dans le type attendu (conversion implicite), GetMute attend un BOOL (4 octets) mais la variable est déclarée boolean (1 octet).
    En lui passant un paramètre var, un pointeur, cette conversion n'est sans doute pas possible, GetMute écrase 3 octets.

    Mais tu devrais pouvoir éviter cette variable intermédiaire en modifiant le prototype de la fonction : Function Volume(Var Mute :bool; Var Vol :integer) :boolean;

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour AndnotOr,

    si je mets un Bool dans la fonction Volume, et si j’appelle endpointVolume.GetMute j'ai une erreur :

    [Erreur] MMDevApi.pas(125): Les types des paramètres VAR originaux et formels doivent être identiques

    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
    19
    20
    21
    { ==================================================================== }
    Function Volume(Var Mute : Bool ; Var Vol : Integer ) : Boolean ;
    Var
      endpointVolume: IAudioEndpointVolume;
      VolumeLevel: Single;
      deviceEnumerator: IMMDeviceEnumerator;
      defaultDevice: IMMDevice;
      bMute : Boolean ;
    begin
      Result := False ;
      CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
      deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
      defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
      if endpointVolume = nil then Exit;
      Result := True ;
      endpointVolume.GetMasterVolumeLevelScaler(VolumeLevel);
      Vol := Round(VolumeLevel * 100) ;
      endpointVolume.GetMute(Mute)  ;    //  Erreur ici
    //  Mute := bMute ;
    End ;
    { ==================================================================== }
    Donc ce ne doit pas être ça ?

    Quand j'ai le curseur sur GetMute je vois : GetMute(Out bMute : Boolean)
    Même avec Out ça ne marche pas avec un Bool

    A+
    Charly

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 700
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 700
    Points : 13 145
    Points
    13 145
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    si je mets un Bool dans la fonction Volume, et si j’appelle endpointVolume.GetMute j'ai une erreur :
    Oui, la variable Mute passée à Volume doit être du type BOOL aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Volume(Var Mute :bool; Var Vol :integer) :boolean;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Mute :bool;
      Vol  :integer;
    begin
      Volume(Mute, Vol);
      CheckBox1.Checked := Mute;  // Conversion implicite de bool en boolean
    end;
    Citation Envoyé par Charly910 Voir le message
    Quand j'ai le curseur sur GetMute je vois : GetMute(Out bMute : Boolean)
    L'interface n'est pas déclarée correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function SetMute(bMute: Bool; pguidEventContext: PGUID): Integer; stdcall;
    function GetMute(out bMute: Bool): Integer; stdcall;

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Ok, avec les déclarations de SetMute et GetMute corrigées, ça fonctionne

    Merci Andnotor, c'est toi qui remporte le grand défi !!

    A+
    Charly

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/11/2014, 17h15
  2. Acess violation avec le composant TShockwaveCtl
    Par Nik_Meilleur dans le forum C++Builder
    Réponses: 1
    Dernier message: 07/04/2007, 11h34
  3. Récupere erreur de Violation de kley unique
    Par neness dans le forum Bases de données
    Réponses: 7
    Dernier message: 26/02/2004, 19h26
  4. Réponses: 3
    Dernier message: 22/05/2002, 09h37

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