Media Player with MASM32/Easy Code, little problem

Started by C.M.Obrecht, July 23, 2008, 09:46:39 PM

Previous topic - Next topic

C.M.Obrecht

Hello,
sorry my english isn't perfect, i tried to ask in german and swiss forums but they doesn't answer! Then i tried in the MASM forum "The Workshop".
Once I made a little Media Player with MASM32 and it runs. So Im programming a 2nd version of this with the EasyCode IDE. I made a scrollabar for skipping like WMP has, and took the same code from the finished running first version, but it don't runs in the new project? What's the problem?

Here some samples which can be important:


forward DB " play MyAlias from ", 0
sforward DB 255 Dup(?), 0
curpos Proc

invoke mciSendString, addr cpos, addr spos, 255, 0
invoke StrToInt, addr spos
mov zahlpos, eax
ret
curpos EndP
setpos Proc
Invoke GetWindowItem, winhWnd, IDC_WINDOW1_SLIDER2
Invoke SendMessage, Eax, TBM_GETPOS, TRUE, NULL

Invoke wsprintf, Addr pos, Addr sformat, Eax
Invoke mciSendString, Addr forward, Addr pos, 0, 0
;Invoke MessageBox, 0, Addr forward, Addr pos, 0
ret
setpos EndP

goback Proc

Mov Eax, zahlpos
sub eax, tensec
invoke wsprintf, addr sforward, addr sformat, eax
Invoke mciSendString, Addr forward, Addr sforward, 0, 0
Invoke MessageBox, 0, Addr forward, Addr sforward, 0
ret
goback endp

Window1Slider2 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM

.If uMsg == WM_LBUTTONUP



         Call setpos



      .EndIf


and here the whole source:


Include   comdlg32.inc
IncludeLib   Comdlg32.lib

Include   shell32.inc
IncludeLib   shell32.lib

Include   \masm32\include\winmm.inc
includelib \masm32\lib\winmm.lib

includelib \masm32\lib\shlwapi.lib
include \masm32\include\shlwapi.inc

.Const

.Data?
szFileName DB 255 Dup(?), 0
szFehler DB 100 Dup(?), 0
winhWnd DD ?

spos DB 255 Dup (?), 0
zahlpos DD ?
zahl DD ?
laenge DD ?
sBuffer DB 255 Dup(?), 0

volstr DB 4 Dup(?), 0
pos DB 255 Dup (?), 0

sforward DB 255 Dup(?), 0
.Data

inull DD 0
status DB "status MyAlias length", 0
cpos DB "status MyAlias position ",0
fehler DB "Fehler bein Öffnen der Datei/keine kompatible Mediendatei oder von dieser Windows-Version nicht unterstützt", 0
sformat DB "%i", 0
mcivolstr DB "setaudio MyAlias volume to ", 0
infoTitel DB "geöffnete Datei", 0

tensec DD 10000
forward DB " play MyAlias from ", 0

ofn                  OPENFILENAME   <0>

open1 DB "open ", 1024 Dup(?), 0
open2 DB " type MPEGVideo alias MyAlias",0         
play DB "play MyAlias",0
stop DB "stop MyAlias",0
filename DB 1024 dup(?)
close DB "close MyAlias", 0
mci3 DB 0

.Code

Window1Procedure Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   .If uMsg == WM_CREATE
Mov Eax, hWnd
Mov winhWnd, Eax
Invoke DragAcceptFiles, Eax, 255
      Return TRUE

      .ElseIf uMsg == WM_VSCROLL

Call setvolume




.ElseIf uMsg == WM_TIMER
.If wParam == 1
    Call curpos
    Invoke GetWindowItem, winhWnd, IDC_WINDOW1_SLIDER2
    Invoke SendMessage, Eax, TBM_SETPOS, zahlpos, zahlpos



.EndIf


.ElseIf uMsg == WM_DROPFILES
   Mov szFileName, 0
        Invoke DragQueryFile, wParam, 0, Addr szFileName, SizeOf szFileName
      invoke mciSendString, ADDR stop, ADDR mci3,0,0
    Invoke mciSendString, Addr close, Addr mci3, 0, 0


        Jmp abspielen


   .ElseIf uMsg == WM_CLOSE
      Invoke mciSendString, Addr stop, Addr mci3, 0, 0
        Invoke mciSendString, Addr close, Addr mci3, 0, 0
      Invoke IsModal, hWnd
      .If Eax
         Invoke EndModal, hWnd, IDCANCEL
         Return TRUE
      .EndIf

      .ElseIf uMsg == WM_COMMAND
         Mov Eax, wParam
         .If Ax == IDC_WINDOW1_BUTTON1
            Shr Eax, 16

            .If Ax == BN_CLICKED

Mov ofn.lStructSize, SizeOf OPENFILENAME
    ;Push hParent
     ;Pop ofn.hWndOwner
    ;Push hInstance
    ;Pop ofn.hInstance
    ;Push lpFilter
    ;Pop ofn.lpstrFilter
    Push Offset szFileName
    Pop ofn.lpstrFile
    Mov ofn.nMaxFile, SizeOf szFileName
   ; Push lpTitle
   ; Pop ofn.lpstrTitle
    Mov ofn.Flags,              OFN_EXPLORER or OFN_FILEMUSTEXIST or \
                                OFN_LONGNAMES


        Invoke GetOpenFileName, Addr ofn
        Invoke mciSendString, Addr stop, Addr mci3, 0, 0
        Invoke mciSendString, Addr close, Addr mci3, 0, 0
abspielen: Mov open1[5], 0       ;open ,0 und nicht weiter, string leeren
Invoke GetShortPathName, Addr szFileName, Addr filename, 255
Lea Esi, open1
FindLastByte:
  lodsb
  Or al, al
  jnz FindLastByte
 
  dec esi
  mov edi, esi
  lea esi, filename
  CatStrings:
  lodsb
  Or al, al
  jz Done
  stosb
  jmp CatStrings
 
Done:
  mov al, 0
  stosb


                 ;Start:     
  lea esi, open1
FindLastByte2:
  lodsb
  Or al, al
  jnz FindLastByte2
 
  dec esi
  mov edi, esi
  lea esi, open2
  CatStrings2:
  lodsb
  Or al, al
  jz Done2
  stosb
  jmp CatStrings2
 
Done2:
  mov al, 0
  stosb

            lea eax, open1
                   
            invoke mciSendString, eax, ADDR mci3,0,0
                                   
           
                lea ebx, mci3
                lea eax, play
                Invoke mciSendString, Eax, Ebx, 0, 0
                Cmp Eax, 0
                Je ok
                Invoke mciGetErrorString, Eax, Addr szFehler, 100
                Invoke MessageBox, winhWnd, Addr szFehler, Addr fehler, MB_OK Or MB_ICONERROR

ok:  Call setvolume
     Call getlength
     
     Invoke GetWindowItem, winhWnd, IDC_WINDOW1_SLIDER2

     Invoke SendMessage, Eax, TBM_SETRANGEMAX, NULL, laenge
;Invoke SetScrollRange, Eax, TBHSCROLL, inull, laenge, FALSE ;ebenfalls falsch


.EndIf
.EndIf

.If Ax == IDC_WINDOW1_BUTTON2
            Shr Eax, 16

            .If Ax == BN_CLICKED

              Invoke mciSendString, Addr stop, Addr mci3, 0, 0
              Invoke mciSendString, Addr close, Addr mci3, 0, 0
            .EndIf
            .EndIf

             


.If Ax == IDC_WINDOW1_BUTTON3
            Shr Eax, 16

            .If Ax == BN_CLICKED

              Invoke mciSendString, Addr stop, Addr mci3, 0, 0

            .EndIf
            .EndIf

            .If Ax == IDC_WINDOW1_BUTTON4
            Shr Eax, 16

            .If Ax == BN_CLICKED

              lea ebx, mci3
                Lea Eax, play
                Invoke mciSendString, Eax, Ebx, 0, 0
                Call setvolume
            .EndIf
            .EndIf

            .If Ax == IDC_WINDOW1_BUTTON5
               Shr Eax, 16
               .If Ax == BN_CLICKED
                  Invoke mciSendString, Addr stop, Addr mci3, 0, 0
        Invoke mciSendString, Addr close, Addr mci3, 0, 0
                     Jmp abspielen
                  .EndIf
                  .EndIf

                  .If Ax == IDC_WINDOW1_BUTTON6
               Shr Eax, 16
               .If Ax == BN_CLICKED
                  Invoke MessageBox, 0, Addr szFileName, Addr infoTitel, MB_ICONINFORMATION
                  .EndIf
                  .EndIf

                  .If Ax == IDC_WINDOW1_BUTTON7
            Shr Eax, 16

            .If Ax == BN_CLICKED

              Call goback
            .EndIf
            .EndIf

            .If Ax == IDC_WINDOW1_BUTTON8
            Shr Eax, 16

            .If Ax == BN_CLICKED

             
            .EndIf
            .EndIf

     


   .EndIf
   Return FALSE
Window1Procedure EndP
setvolume Proc
   Mov mcivolstr[28], 0
   Mov volstr, 0000
Invoke GetWindowItem, winhWnd, IDC_WINDOW1_SLIDER1
Invoke SendMessage, Eax, TBM_GETPOS, TRUE, NULL
Invoke wsprintf, Addr volstr, Addr sformat, Eax

Lea Esi, mcivolstr
FindLastByte3:
  lodsb
  Or al, al
  Jnz FindLastByte3
 
  dec esi
  mov edi, esi
  Lea Esi, volstr
CatStrings1:
  lodsb
  Or al, al
  Jz Done1
  stosb
  Jmp CatStrings1
 
Done1:
  mov al, 0
  stosb


                 ;Start:     
  lea esi, open1
FindLastByte2:
  lodsb
  Or al, al
  jnz FindLastByte2
 
  dec esi
  mov edi, esi
  lea esi, open2
CatStrings3:
  lodsb
  Or al, al
  Jz Done3
  stosb
  Jmp CatStrings3
 
Done3:
  mov al, 0
  stosb
Lea Eax, mcivolstr

Invoke mciSendString, Eax, 0, 0, 0
Ret
setvolume EndP
getlength Proc

invoke mciSendString, addr status, addr sBuffer,255, 0

invoke StrToInt, addr sBuffer

 
mov laenge, eax
ret
getlength endp

curpos Proc

invoke mciSendString, addr cpos, addr spos, 255, 0
invoke StrToInt, addr spos
mov zahlpos, eax
ret
curpos EndP
setpos Proc
Invoke GetWindowItem, winhWnd, IDC_WINDOW1_SLIDER2
Invoke SendMessage, Eax, TBM_GETPOS, TRUE, NULL

Invoke wsprintf, Addr pos, Addr sformat, Eax
Invoke mciSendString, Addr forward, Addr pos, 0, 0
;Invoke MessageBox, 0, Addr forward, Addr pos, 0
ret
setpos EndP

goback Proc

Mov Eax, zahlpos
sub eax, tensec
invoke wsprintf, addr sforward, addr sformat, eax
Invoke mciSendString, Addr forward, Addr sforward, 0, 0
Invoke MessageBox, 0, Addr forward, Addr sforward, 0
ret
goback endp

Window1Button1 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Button1 EndP


Window1Button2 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM

   Return FALSE
Window1Button2 EndP

Window1Slider1 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Slider1 EndP

Window1Static1 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Static1 EndP

Window1Button3 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Button3 EndP

Window1Button4 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Button4 EndP


Window1Static2 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Static2 EndP

Window1Static3 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Static3 EndP

Window1Slider2 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM

.If uMsg == WM_LBUTTONUP



         Call setpos



      .EndIf

   Return FALSE
Window1Slider2 EndP

Window1Button5 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Button5 EndP

Window1Button6 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Button6 EndP

Window1Button7 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Button7 EndP

Window1Button8 Proc Private hWnd:HWND, uMsg:ULONG, wParam:WPARAM, lParam:LPARAM
   Return FALSE
Window1Button8 EndP

Thank you!

   





jj2007

Quote from: C.M.Obrecht on July 23, 2008, 09:46:39 PM
but it don't runs in the new project?
You will have more chances to get help if you describe the symptoms (does it assemble? If not, which lines give which error messages?), and/or invest some time in debugging your problem.
If OllyDbg is too difficult, try the attached debug macro to get info where and why your code fails.
Usage:
   mbDebug 0, "Show me the vars:", MyCounter, MyThirdVar, MyFilePath$
   mbDebug 1, "Show me other variables:", My2ndCounter, esi, eax, My4thVar, MyFilePath$
The first parameter is a "slot", and each slot can be switched off separately by simply clicking Cancel. That is handy when you are stuck in loops.

[attachment deleted by admin]

C.M.Obrecht

Thank you,

the project assembles and runs. But when i scroll the trackbar then happens nothing; when I take a MessageBox there it'll not appear too.
I've made a button with the function of skip 10 seconds backward, like in the previous version and this don't runs too; no exception, it happens anything.

I tried to debug with w32dasm, but this is hard :) Thank you

Ramon Sala

Hi C.M.Obrecht,

Please give some time and I'll have a look at your project. If possible, I'll tell you something tomorrow.

Ramon
Greetings from Catalonia

Ramon Sala

Hi ,

I think the problem is in the setpos procedure, where you call the mcisendstring function with the "play MyAlias from" string in the first parameter and the position (in your code the pos variable) in the second parameter. That doesn ot work, as the position value has to be in the same string than "play MyAlias from". Change the following code:

setpos Proc
Invoke GetWindowItem, winhWnd, IDC_WINDOW1_SLIDER2
Invoke SendMessage, Eax, TBM_GETPOS, TRUE, NULL

Invoke wsprintf, Addr pos, Addr sformat, Eax

;======= Comment this line =======
;Invoke mciSendString, Addr forward, Addr pos, 0, 0

;=== and add the three following lines ===
Invoke lstrcpy, Addr sforward, Addr forward
Invoke lstrcat, Addr sforward, Addr pos
Invoke mciSendString, Addr sforward, 0, 0, 0

;Invoke MessageBox, 0, Addr forward, Addr pos, 0
ret
setpos EndP

As you will see, now it works.

I hope that will solve the problem.

Regards,
Greetings from Catalonia

C.M.Obrecht

Yes I tought about this too, but look; this sample is from the first player I made with MASM32 and it works:
goback proc
mov eax, zahlpos
sub eax, tensec
invoke wsprintf, addr sforward, addr sformat, eax
invoke mciSendString, addr forward, addr sforward,0,0
ret
goback endp

..it's the same. Maybe different versions of mciSendString?
This player you can download under http://www.shareware.de/software-autoren/reben-studioaufnahmemedieninformatik-cmobrecht_28822.html (the 20 Kb version "micro" does it).

You have the project :)

Thanks