[VB.net] Volume control

Pagina: 1
Acties:
  • 144 views sinds 30-01-2008
  • Reageer

  • mark117
  • Registratie: Oktober 2002
  • Laatst online: 02-07 16:31
een echte breinbreker.....

Ik ben in vb.net voor een onderdeel van een programma een onderdeel aan het maken dat het volume in windows aan kan passen, ik heb een aantal voorbeelden gevonden in VB6, en die werken gewoon wel.

Nu heb ik een poging gedaan om dat te porten naar VB.net.

Ik gebruik een aantal API-calls uit de winmm.dll, en op het punt waar ik de goed mixer wil openen is het resultaat van die code MMSYSERR_INVALPARAM.

Hierbij de relevante code:

Visual Basic .NET:
1
2
Private Declare Function mixerOpen Lib "winmm.dll" (ByVal phmx As Long, ByVal uMxId As Long, 
ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal fdwOpen As Long) As Int64


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  Public Function OpenMixer(ByVal MixerNumber As Long) As Long

    Dim ret As Long

    ' is there a mixer available?
    If MixerNumber < 0 Or MixerNumber > mixerGetNumDevs - 1 Then Exit Function

    ' open the mixer
    ret = mixerOpen(hMixerHandle, MixerNumber , 0, 0, 0)
    If ret <> MMSYSERR_NOERROR Then
      MsgBox(ret & "<>" & MMSYSERR_NOERROR)
      Exit Function
    Else
      MsgBox("geen error")
    End If
End Function

nu moet de hMixerHandle gevuld worden met een long die naar de mixer refereerd

wat raar is is dat dezelfde code het wel doen in VB6

er zitten nog een heel zooitje constante bij maar dui hebben niet veel te maken met het probleem

wat ik me dan ook noh afvroeg tijdens het zoeken naar een oplossing voor dit probleem of ik de enige was die dit ook geprobeerd heeft in vb.net, want er is geen enkel voorbeeld van te vinden, wel veel in VB6(of ik ben bezig op een hele verkeerde manier, kan natuurlijk ook nog)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

Ik ben dus absoluut geen VB.NET Expert (gebruik het never)

maar een ding weet ik volgens mij wel:
VB.NET long != VB long

volgens mij moet je een integer gebruiken, in VB.NET. Weet het niet zeker :)

  • mark117
  • Registratie: Oktober 2002
  • Laatst online: 02-07 16:31
Ik heb voor alles een keer Long gebruikt, maar ook de vb.net versie daarvan, de Int64, en nog steeds heb ik dezelfde foutmelding.

Ik heb nog even verder gezocht, maar er is absoluut geen documentatie op de foumelding die ik krijg : MMSYSERR_INVALPARAM.

Er staat alleen bij "the parameter is invalid :/ )

  • Kuhlie
  • Registratie: December 2002
  • Niet online
De Long in VB6 is een 32-bits getal. Je moet dus de Integer in VB.Net gebruiken, die is 32 bits.

  • mark117
  • Registratie: Oktober 2002
  • Laatst online: 02-07 16:31
Ik heb het eerste probleem opgelost :*)
in de mixerOpen moest de handle worden gedeclareerd als een pointer, dus als een intPtr

maar het zou helemaal niet leuk zijn als alles in 1 keer goed zou gaan, het volgende probleem is nu:

De volgende functie is:

Visual Basic .NET:
1
 Public Declare Function mixerGetLineInfo Lib "winmm.dll" Alias "mixerGetLineInfoA" (ByVal hmxobj As Integer, <MarshalAs(UnmanagedType.Struct)> ByRef pmxl As MIXERLINE, ByVal fdwInfo As Integer) As Integer


Zoals je ziet wordt er een pointer gezet naar een Structure, deze heb ik netjes gedefineerd aan de hand van de documentatie op msdn:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  <StructLayout(LayoutKind.Sequential)> Public Structure MIXERLINE
    Public cbStruct As Integer                       '  size of MIXERLINE structure
    Public dwDestination As Integer                  '  zero based destination index
    Public dwSource As Integer                       '  zero based source index
    Public dwLineID As Integer                       '  unique line id for mixer device
    Public fdwLine As Integer                        '  state/information about line
    Public dwUser As Integer                         '  driver specific information
    Public dwComponentType As Integer                '  component type line connects to
    Public cChannels As Integer                      '  number of channels line supports
    Public cConnections As Integer                   '  number of connections
    Public cControls As Integer                      '  number of controls at this line
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_SHORT_NAME_CHARS)> Public szShortName As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_LONG_NAME_CHARS)> Public szName As String
    Public tTarget As Target
  End Structure

de aanroep van deze functie gaat op de volgende manier
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   Dim mxl As MIXERLINE
    Dim ret As Integer

    mxl.cbStruct = Len(mxl)
    mxl.dwComponentType = componentType

    ' Obtain a line corresponding to the component type
    ret = mixerGetLineInfo(hMixer, mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)
    Select Case (ret)
      Case MMSYSERR_INVALPARAM
        MsgBox("hij doet het nog steeds niet")

      Case MMSYSERR_NOERROR
        MsgBox("hij doet het")

    End select


maar ik krijg nu dezelfde foutmelding als bij het eerste probleem : Invalid parameter.

Ik zou echt niet meer weten op welke andere manier ik deze functie aan kunnen roepen, wat ik denk is dat hij de structure niet ziet als een pointer..
als dat zo is zal mijn vraag dan zijn: hoe vertel ik hem dat het een pointer is (los van het Byref in de functie definitie)