uFMOD + ASM + Readfile => error

Hi

Ich habe angefangen, mich etwas intensiver mit Assembler auseinanderzusetzen,
und wollte jetzt einen kleinen XM-Musikplayer schreiben.
Soweit sogut, allerdings habe ich jetzt einen Fehler, wenn ich uFMOD_PlaySong starte:

Code:
mov ofn.lStructSize, SIZEOF ofn
mov ofn.lpstrFilter, offset filter
mov ofn.lpstrFile, offset filter
mov ofn.Flags, OFN_EXPLORER + OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST
mov ofn.nMaxFile,512
invoke GetOpenFileName,addr ofn
.if eax == TRUE;If file is open, filter == filename
 invoke CreateFile, addr filter, GENERIC_READ+ GENERIC_WRITE,  FILE_SHARE_READ + FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
 .if eax!=INVALID_HANDLE_VALUE
  mov hTarget, eax
  invoke ReadFile,hTarget,addr table, 1024,addr error,0
  .if error == 0;Error = bytes read.
    invoke MessageBox ,0, addr readerror, addr readerror, 0
   .else
    invoke uFMOD_PlaySong,addr table,error,XM_MEMORY
  .endif
 .endif 
.endif
invoke CloseHandle,hTarget

Bei dem
invoke uFMOD_PlaySong,addr table,error,XM_MEMORY
bekomm ich einen Speicherzugriffsfehler.

Was mach ich falsch?


Vielen Dank im voraus =)
 
Naja, Du könntest versuchen, die Datei erstmal komplett in den Speicher zu laden und dann abzuspielen - oder gleich XM_FILE Parameter verwenden:
Code:
invoke uFMOD_PlaySong,addr filter,NULL,XM_FILE
 
Original von CDW
Naja, Du könntest versuchen, die Datei erstmal komplett in den Speicher zu laden und dann abzuspielen - oder gleich XM_FILE Parameter verwenden:
Code:
invoke uFMOD_PlaySong,addr filter,NULL,XM_FILE

Wird die Datei nicht durch den Read-Befehl komplett in den Speicher geladen?

mit XM_FILE kommt kein Zugriffsfehler, allerdings kommt auch kein Sound.
 
kommt darauf an, wie groß die Datei ist - Du hast ja Maximaleinschränkung von 1024 angegeben.

Hier mal ein Testprojekt (nutzt beide Optionen - einmal selber laden und einmal XM_FILE, beides funktioniert ;) ). Statt VirtualAlloc und ReadFile kann man natürlich auch FileMapping nutzen.

Habe "originale" ufmod.inc/lib aus dem MASM-Beispielordner genommen. Wenn man die Lib selber erstellt, sollte man auf die Optionen achten (nicht, dass XM_FILE deaktiviert ist ;) ).
 
Original von CDW
kommt darauf an, wie groß die Datei ist - Du hast ja Maximaleinschränkung von 1024 angegeben.

Hier mal ein Testprojekt (nutzt beide Optionen - einmal selber laden und einmal XM_FILE, beides funktioniert ;) ). Statt VirtualAlloc und ReadFile kann man natürlich auch FileMapping nutzen.

Habe "originale" ufmod.inc/lib aus dem MASM-Beispielordner genommen. Wenn man die Lib selber erstellt, sollte man auf die Optionen achten (nicht, dass XM_FILE deaktiviert ist ;) ).

Danke =)

Den Fehler hab ich zwar nicht bekommen, aber mit deinem VirtualAlloc klappt es jetzt.

Code:
invoke CreateFile, addr filename, GENERIC_READ+ GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
				.if eax!=INVALID_HANDLE_VALUE
					mov hTarget, eax
					 invoke GetFileSize,hTarget,0
					 mov count, eax
					 invoke VirtualAlloc,0,count,MEM_COMMIT,PAGE_READWRITE
					 mov pMem,eax
					invoke ReadFile,hTarget,pMem, count,addr error,0
					.if error == 0;Error = bytes read.
						invoke SetDlgItemText,hWnd,IDC_STATUS, addr readerror
					.else
						invoke uFMOD_PlaySong,pMem,count ,XM_MEMORY
						invoke SetDlgItemText,hWnd,IDC_STATUS, addr playing
					.endif
				.endif
 
Zurück
Oben