关于PlaySound函数的用法详解,该怎么解决
关于PlaySound函数的用法详解
我把我在学习使用PlaySound函数时遇到的问题与大家探讨一下:
下面是我写的一个win32汇编程序,关于PlaySound有如下几点说明:
1.在使用它时要添加下面的语句
include winmm.inc;包含PlaySound的声明
includelib WINMM.lib
如果不包含以上语句,编译器会对PlaySound报错,这个问题可能是很多初学者会遇到的。
2.BOOL PlaySound(PCSTR pszSound,HMODULE hmod, DWORD fdwSound);
如果在第三个参数中指明了SND_FILENAME,那么只要在第一个参数中指明音乐文件的正确路径并将第二个参数写为NULL即可;
但如果第三个参数中指明的是SND_RESOURCE时,我使用罗云彬书上第五章179(第二版)上讲的使用自定义资源的方法来做可没成功。
不知我哪错了,希望高手帮忙解决,补充完PlaySound的用法,好为初学者指点津。
;MASMPlus 代码模板 - 普通的 Windows 程序代码
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
include winmm.inc;包含PlaySound的声明
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
includelib WINMM.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA
szClassName db "MASMPlus_Class",0
szResType BYTE "WAVE",0
music BYTE "E:\我的音乐\Love",0
.DATA?
hInstance dd ?
.CODE
START:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset szClassName
invoke LoadIcon,hInst,100
mov wc.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov wc.hIconSm,0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx,NULL,ADDR szClassName,CTXT("Play Sound"),WS_OVERLAPPEDWINDOW,200,200,400,200,NULL,NULL,hInst,NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
.if uMsg==WM_CREATE
;invoke FindResource,hinstance,1005,addr szResType
;.if eax 把这些语句前的注释符去掉就是我的问题2中讲的
; invoke LoadResource,hinstance,eax
; mov hRes,eax
; .if eax
; invoke LockResource,eax
invoke PlaySound,addr music,NULL,SND_FILENAME or SND_ASYNC
; invoke PlaySound,addr music hRes,SND_RESOURCE or SND_ASYNC
; .endif
;.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
.endif
ret
WndProc endp
END START
------解决方案--------------------
我把我在学习使用PlaySound函数时遇到的问题与大家探讨一下:
下面是我写的一个win32汇编程序,关于PlaySound有如下几点说明:
1.在使用它时要添加下面的语句
include winmm.inc;包含PlaySound的声明
includelib WINMM.lib
如果不包含以上语句,编译器会对PlaySound报错,这个问题可能是很多初学者会遇到的。
2.BOOL PlaySound(PCSTR pszSound,HMODULE hmod, DWORD fdwSound);
如果在第三个参数中指明了SND_FILENAME,那么只要在第一个参数中指明音乐文件的正确路径并将第二个参数写为NULL即可;
但如果第三个参数中指明的是SND_RESOURCE时,我使用罗云彬书上第五章179(第二版)上讲的使用自定义资源的方法来做可没成功。
不知我哪错了,希望高手帮忙解决,补充完PlaySound的用法,好为初学者指点津。
;MASMPlus 代码模板 - 普通的 Windows 程序代码
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
include winmm.inc;包含PlaySound的声明
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
includelib WINMM.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA
szClassName db "MASMPlus_Class",0
szResType BYTE "WAVE",0
music BYTE "E:\我的音乐\Love",0
.DATA?
hInstance dd ?
.CODE
START:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset szClassName
invoke LoadIcon,hInst,100
mov wc.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov wc.hIconSm,0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx,NULL,ADDR szClassName,CTXT("Play Sound"),WS_OVERLAPPEDWINDOW,200,200,400,200,NULL,NULL,hInst,NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
.if uMsg==WM_CREATE
;invoke FindResource,hinstance,1005,addr szResType
;.if eax 把这些语句前的注释符去掉就是我的问题2中讲的
; invoke LoadResource,hinstance,eax
; mov hRes,eax
; .if eax
; invoke LockResource,eax
invoke PlaySound,addr music,NULL,SND_FILENAME or SND_ASYNC
; invoke PlaySound,addr music hRes,SND_RESOURCE or SND_ASYNC
; .endif
;.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
.endif
ret
WndProc endp
END START
------解决方案--------------------
- Assembly code
invoke PlaySound,hRes,hInstance,SND_RESOURCE or SND_ASYNC