Zugriff auf winmm.dll-Funktion (MP3-Player)



  • Ich habe vor wenigen Tagen folgenden Code gefunden:

    Quelle: http://www.vbarchiv.net/archiv/tipp_499.html

    Private Declare Function mciSendString Lib "winmm.dll" _
    Alias "mciSendStringA" (ByVal lpszCommand As String, _
    ByVal lpszReturnString As String, _
    ByVal cchReturnLength As Long, _
    ByVal hwndCallback As Long) As Long
    If mciSendString("open " & sFile & _
    " type MPEGVideo alias MyMP3", 0, 0, 0) = 0 Then
    ' MP3 abspielen
    mciSendString "play MyMP3 from 0", 0, 0, 0
    End If

    Wenn ich das in C# umwandeln würde, komme ich auf folgenden Code:

    [DllImport("winmm.dll", EntryPoint="mciSendStringA")]
    private extern long mciSendString(string lpszCommand, string lpszReturnString, long cchReturnLength, long hwndCallBack);

    if (mciSendString("open c:\\music.mp3 type MPEGVideo alias MyMP3", null, 0, 0) = 0) mciSendString("play MyMP3 from 0", null, 0, 0);

    Beim Debuggen jedoch bekam ich eine PInvoke-StackImbalance (oder so etwa hieß das). Dabei wurde der unterstrichene Code als falsch markiert). Selbst mit der try/catch-Anwendung machte er die Meldung weiterhin, so das ich keinen Fehler herausfand. Nach einiger Leserei bekam ich heraus, das der Fehler nichts anderes bedeutet, als wenn irgendwelche Variablen nicht richtig sind.
    Daher meine Frage: Kennt irgendjemand den richtigen Syntax bzw. Befehl für das Abspielen von MP3s mit C# unter Windows XP ohne das man eine Komponente wie den Media-Player verwendet.
    PS: Hat jemand noch eine zuverlässige Quelle, was man mit dem Befehl mciSendStringA noch alles anstellen kann? (hab gehört, man kann auch Lautstärke einzelner Quellen (Wave, Midi, Micro usw.) ändern und den CD-Laufwerksstatus abfragen).
    PS: Das "null" in den Variablen habe ich versucht, da laut Syntax der zweite Wert ein String sein soll (da hat villeicht der Autor ausm VB nen Fehler gemacht).





  • Ah, super...

    Also ich habe da rausgefunden, das die 4. (letzte) Variable kein Integer, sondern ein IntegerPointer (IntPtr) sein soll.
    Ich versuche es mal so.
    An 2. Stelle fand ich auch noch einen StringBuilder nach einer genaueren Suche.
    Ich versuche mal alle möglichen Variablenkombinationen und hoffe, das es diesmal klappt.
    Wenns nicht klappt, melde ich mich wieder.

    Thx 😉

    Edit: Ich schreib mal den Code so, wie ich ihn derzeit habe:

    [DllImport("winmm.dll", EntryPoint="mciSendStringA")]
    private extern long mciSendString(string lpszCommand, string lpszReturnString, long cchReturnLength, long hwndCallBack);

    StringBuilder retString=new StringBuilder(new string(' ',256));
    if (mciSendString("open c:\\music.mp3 type MPEGVideo alias MyMP3", null, 0, 0) = 0) mciSendString("play MyMP3 from 0", retString, 0, IntPtr.Zero);


Anmelden zum Antworten