Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1452 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Plantage GlobalAlloc() dans VB6

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Plantage GlobalAlloc() dans VB6

n°1348899
antidotes
Posté le 18-04-2006 à 15:41:12  profilanswer
 

Bonjour,
 
J'ai un plantage dans mon application au niveau de la fonction GlobalAlloc(), je n'ai aucun message d'erreur mais l'application se ferme brusquement.
 
Je lance une première fois la fonction StartInput() ça marche correctement en cours d'enregistrement je lance régulièrement la fonction GetVolume() sur un timer d'intervalle 1, lorsque j'ai fini mon enregistrement je déclanche la fonction StopInput(). Jusque là tout va bien mais si je veux relancer la fonction StartInput() directement derrière pour relancer un enregistrement le GlobalAlloc() sur hmem(0) marche mais celui sur hmem(1) fait planter l'application.  
 
Dans le code ci-dessous la valeur de BUFFER_SIZE est 700 et NUM_BUFFERS est 2. buffaddress est une variable globale
 
Code de StartInput() :

Code :
  1. Public Function StartInput() As Boolean
  2. On Error GoTo err
  3.     format.wFormatTag = 1
  4.     format.nChannels = 1
  5.     format.wBitsPerSample = 8
  6.     format.nSamplesPerSec = 12000
  7.     format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8
  8.     format.nAvgBytesPerSec = format.nSamplesPerSec *   format.nBlockAlign
  9.     format.cbSize = 0
  10.     For i = 0 To NUM_BUFFERS - 1
  11.         hmem(i) = GlobalAlloc(&H40, BUFFER_SIZE)
  12.         inHdr(i).lpData = GlobalLock(hmem(i))
  13.         inHdr(i).dwBufferLength = BUFFER_SIZE
  14.         inHdr(i).dwFlags = 0
  15.         inHdr(i).dwLoops = 0
  16.     Next
  17.     rc = waveInOpen(hWaveIn, DEVICEID, format, 0, 0, 0)
  18.     If rc <> 0 Then
  19.         waveInGetErrorText rc, msg, Len(msg)
  20.         MsgBox msg
  21.         StartInput = False
  22.         Exit Function
  23.     End If
  24.     For i = 0 To NUM_BUFFERS - 1
  25.         rc = waveInPrepareHeader(hWaveIn, inHdr(i), Len(inHdr(i)))
  26.         If (rc <> 0) Then
  27.             waveInGetErrorText rc, msg, Len(msg)
  28.             MsgBox msg
  29.         End If
  30.     Next
  31.     For i = 0 To NUM_BUFFERS - 1
  32.         rc = waveInAddBuffer(hWaveIn, inHdr(i), Len(inHdr(i)))
  33.         If (rc <> 0) Then
  34.             waveInGetErrorText rc, msg, Len(msg)
  35.             MsgBox msg
  36.         End If
  37.     Next
  38.     fRecording = True
  39.     rc = waveInStart(hWaveIn)
  40.     StartInput = True
  41.     Exit Function
  42. err:
  43.     StartInput = False
  44. End Function


 
Code de StopInput() :

Code :
  1. Public Function StopInput() As Integer
  2.     On Error GoTo err
  3.     fRecording = False
  4.     waveInReset hWaveIn
  5.     waveInStop hWaveIn
  6.     For i = 0 To NUM_BUFFERS - 1
  7.         waveInUnprepareHeader hWaveIn, inHdr(i), Len(inHdr(i))
  8.         GlobalFree hmem(i)
  9.     Next
  10.     waveInClose hWaveIn
  11.     GlobalFree volHmem
  12.     StopInput = 0
  13.     Exit Function
  14. err:
  15.     StopInput = 1
  16. End Function


 
Code de getVolume() :

Code :
  1. Public Function getVolume(pbuff As Long) As Integer
  2. Dim n As Integer
  3.    On Error Resume Next
  4.          Do While Not inHdr(0).dwFlags And WHDR_DONE
  5.      
  6.          Loop
  7.             iValue.Caption = CStr(0)
  8.             iValue.Refresh
  9.             CopyStructFromPtr audbytearray, inHdr(0).lpData, inHdr(0).dwBufferLength
  10.             rc = waveInAddBuffer(hWaveIn, inHdr(0), Len(inHdr(0)))
  11.     tempval = 0
  12.     posval = 0
  13.     For n = 0 To BUFFER_SIZE - 1
  14.         posval = audbytearray.bytes(n) - 128
  15.         If posval < 0 Then posval = 0 - posval
  16.         If posval > tempval Then tempval = posval
  17.     Next n
  18.         getVolume = tempval
  19.         pbuff = inHdr(0).lpData
  20. End Function


 
Appel de la fonction StartInput() :

Code :
  1. SoundMeter.StartInput
  2.         Timer1.Enabled = True


 
Appel de la fonction StopInput() :

Code :
  1. Dim i As Long
  2.     Timer1.Enabled = False
  3.     For i = 1 To 500000
  4.     Next
  5.     SoundMeter.StopInput
  6.     buffaddress = 0


 
Appel de la fonction getVolume() :

Code :
  1. Private Sub Timer1_Timer()
  2.     Dim vValeur As Long
  3.     vValeur = SoundMeter.getVolume(buffaddress)
  4.     Select Case vValeur
  5.      ...
  6.     End Select


Message édité par antidotes le 18-04-2006 à 15:45:33
mood
Publicité
Posté le 18-04-2006 à 15:41:12  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Plantage GlobalAlloc() dans VB6

 

Sujets relatifs
logiciel de SUDOKU - moteur de grilles sous VB6cherche confirmé en vb6 pour bug dans projet open source
cherche confirmé en vb6 pour bug dans projet open sourceplantage lors de l'exécution (un seul cas de figure)
Probleme avec le controle LEAD dans VB6[VB6] Accéder à la fenêtre "Ajouter aux favoris" d'Internet Explorer
[VB6]Caractere d'échappementCherche Developpeur VB6
Fichier CHM & VB6problème connection VB6 vers MSSQL par ODBC W2003 SERVEUR
Plus de sujets relatifs à : Plantage GlobalAlloc() dans VB6


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR