Frage zu den _mem-Funktionen von wouter!

  • ch versuche einfach (weil mir langweilig is) den aktuell gespielten Song in Winamp durch die Memory auszugeben...
    Mit diesem Code funktioniert es aber leider nicht....
    Kann mir da vielleicht jemand helfen?

    [autoit]


    Func GetSong(); Adresse: 0012ADF5
    If ProcessExists("WinAmp.exe") Then
    $pid = ProcessExists("WinAmp.exe")
    ;~ msgbox(0, "", $pid)
    $open = _MemOpen($pid)
    $song = _MemRead($open, 0x0012ADF5)
    msgbox(0, "Song", $song)
    _MemClose($pid)
    EndIf
    EndFunc ;~~>Songname

    [/autoit]
  • Guten Morgen,

    ich habe mir die Funktion mal näher angesehen. Unter der angegebenen Adresse konnte ich leider keine Info auslesen, mir ist es zwar gelungen um pausen-modus bzw. wenn der titel in winamp geladen ist, die Adresse zu ermitteln und die Info auch auszulesen - mehr geht aber im Moment nicht.
    Das Prinzip funktioniert - soweit ich es einschätzen kann mit Winamp 5.3 - jedenfalls sollte der Ansatz zur Lösung nicht weit sein.

    [autoit]


    If ProcessExists("WinAmp.exe") Then
    $pid = ProcessExists("WinAmp.exe")
    $open = _MemOpen($pid)
    $song = _MemRead($open, 0x0012AC34)
    msgbox(0, "Song", $song)
    _MemClose($pid)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Func _MemOpen($i_Pid, $i_Access = 0x1F0FFF, $i_Inherit = 0)
    Local $av_Return[2] = [DllOpen('kernel32.dll') ]
    Local $ai_Handle = DllCall($av_Return[0], 'int', 'OpenProcess', 'int', $i_Access, 'int', $i_Inherit, 'int', $i_Pid)
    If @error Then
    DllClose($av_Return[0])
    SetError(1)
    Return 0
    EndIf
    $av_Return[1] = $ai_Handle[0]
    Return $av_Return
    EndFunc ;==>_MemOpen
    Func _MemRead($ah_Mem, $i_Address, $i_Size = 0)
    If $i_Size = 0 Then
    Local $v_Return = ''
    Local $v_Struct = DllStructCreate('byte[1]')
    Local $v_Ret

    While 1
    $v_Ret = DllCall($ah_Mem[0], 'int', 'ReadProcessMemory', 'int', $ah_Mem[1], 'int', $i_Address, 'ptr', DllStructGetPtr($v_Struct), 'int', 1, 'int', '')
    $v_Ret = DllStructGetData($v_Struct, 1)
    If $v_Ret = 0 Then ExitLoop
    $v_Return &= Chr($v_Ret)
    $i_Address += 1
    WEnd

    Else
    Local $v_Struct = DllStructCreate('byte[' & $i_Size & ']')
    Local $v_Ret = DllCall($ah_Mem[0], 'int', 'ReadProcessMemory', 'int', $ah_Mem[1], 'int', $i_Address, 'ptr', DllStructGetPtr($v_Struct), 'int', $i_Size, 'int', '')
    Local $v_Return[$v_Ret[4]]
    For $i = 0 To $v_Ret[4] - 1
    $v_Return[$i] = DllStructGetData($v_Struct, 1, $i + 1)
    Next
    EndIf
    Return $v_Return
    EndFunc ;==>_MemRead
    Func _MemClose($ah_Mem)
    Local $av_Ret = DllCall($ah_Mem[0], 'int', 'CloseHandle', 'int', $ah_Mem[1])
    DllClose($ah_Mem[0])
    Return $av_Ret[0]
    EndFunc ;==>_MemClose

    [/autoit]

    Mfg
    trallala

  • ArtMoney?

    Naja..ich würde den aktuellen WinampTitel einfach über den Winamp Titel auslesen ;)

    [autoit]


    $OldTitle = $Title
    $Title = WinGetTitle("classname=Winamp v1.x")
    $Title = StringTrimRight($Title, 9)
    $Spot = StringInStr($Title, ". ")
    $Spot = $Spot + 1
    $Title = StringTrimLeft($Title, $Spot)

    [/autoit]

    Einmal editiert, zuletzt von XxXFaNtA (7. Oktober 2006 um 16:41)

  • wenn du mal guckst, dann wirste sehen, dass ich das vor langer zeit schonmal gemacht hab^^
    ich will es einfach mit meory versuchen

  • hallo,

    ich habe mich mal ein bisschen im RAM umgesehen, mit einem debuger ;)

    mfg
    trallala

    Einmal editiert, zuletzt von trallala (7. Oktober 2006 um 19:58)