【急】求一个汇编语言的小程序,急呀……

yeah7725 2010-01-15 02:32:37
怎么用win32汇编播放音乐啊~~

RT,在线等
星期天就要交了~~~
...全文
130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
friendly_ 2010-01-16
  • 打赏
  • 举报
回复
可以查阅下mciSendString API 的相关用法,一下是一个简单的测试程序,其中D:\Media\Music\美丽心情.mp3是你要播放的音乐的路径


.386
.MODEL flat,stdcall
option casemap:none


include windows.inc
include user32.inc
include kernel32.inc
include winmm.inc
includelib user32.lib
includelib kernel32.lib
includelib winmm.lib

.data
str1 db "open D:\Media\Music\美丽心情.mp3 alias mp3",0
str2 db "play mp3 wait",0
.code
start:
invoke mciSendString,offset str1, 0, 0, 0
invoke mciSendString,offset str2, 0, 0, 0
invoke ExitProcess,NULL
end start

yeah7725 2010-01-16
  • 打赏
  • 举报
回复
辛苦各位了~~嘻嘻~~还是最感谢(狼の禅)童鞋~~
KingWolfOfSky 2010-01-16
  • 打赏
  • 举报
回复
KingWolfOfSky 2010-01-16
  • 打赏
  • 举报
回复

TITLE Demo.asm
; ===============================================
; Author: 狼の禅
; Date: 09/10/2010
; ===============================================
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include masm32.inc
include shell32.inc
include winmm.inc
include comdlg32.inc
includelib user32.lib
includelib comctl32.lib
includelib masm32.lib
includelib winmm.lib
includelib comdlg32.lib
; -----------------------------------------------
MENU_ABOUTAUTHOR equ 1000
MENU_SELECT equ 1001
MENU_START equ 1002
MENU_PAUSE equ 1003
; -----------------------------------------------
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
PlayMidiFile PROTO :DWORD, :DWORD
; ===============================================
.data
hInstance dd 0 ;应用程序句柄
hWnd dd 0 ;窗口句柄
hMenu dd 0 ;菜单句柄

ClassName db "Demo",0
WindowName db "Demo(狼の禅)",0
MenuAbout db "帮助(&H)", 0
MenuAboutAuthor db "关于作者(&A)", 0
FileFilter db "Mid Files (*.mid)",0,"*.mid",0 ;文件名过滤
FilePath db 128 dup(0) ;打开音乐文件名
szMIDISeqr db "Sequencer",0
MidDeviceID dd 0
MenuSelect db "选择音乐",0
MenuStart db "播放音乐",0
MenuPause db "暂停音乐",0
Author db "Author:狼の禅",0dh,"Date: 16/01/2010",0
; ===============================================
.code
start:
invoke GetModuleHandle,0 ;获取应用程序模块句柄
mov hInstance,eax ;保存应用程序句柄
invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
invoke ExitProcess,eax ;退出程序,并返回eax的值
; ===============================================
WinMain proc hInst:DWORD, hPrevInst:DWORD,CmdLine:DWORD, CmdShow:DWORD

LOCAL wndclass:WNDCLASSEX
LOCAL Msg:MSG

mov wndclass.cbSize,sizeof WNDCLASSEX
mov wndclass.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wndclass.lpfnWndProc,OFFSET WndProc
mov wndclass.cbClsExtra,0
mov wndclass.cbWndExtra,0
mov eax,hInst
mov wndclass.hInstance,eax
mov wndclass.hbrBackground,COLOR_WINDOW+1
mov wndclass.lpszMenuName,0
mov wndclass.lpszClassName,OFFSET ClassName
invoke LoadIcon,hInst,NULL
mov wndclass.hIcon,eax
invoke LoadCursor,0,IDC_ARROW
mov wndclass.hCursor,eax
mov wndclass.hIconSm,0

invoke RegisterClassEx,ADDR wndclass ;注册用户定义的窗口类
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR ClassName,
ADDR WindowName,
WS_OVERLAPPEDWINDOW,
200,50,500,300,
0,0,
hInst,0 ;创建窗口
mov hWnd,eax ;保存窗口句柄
invoke ShowWindow,hWnd,SW_SHOWNORMAL ;
invoke UpdateWindow,hWnd
MessageLoop:
invoke GetMessage,ADDR Msg,0,0,0 ;获取消息
cmp eax,0
je ExitProgram
invoke TranslateMessage,ADDR Msg ;转换键盘消息
invoke DispatchMessage,ADDR Msg ;分发消息
jmp MessageLoop
ExitProgram:
mov eax,Msg.wParam
ret
WinMain endp
; ===============================================
WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
local hPopMenu ;一级菜单句柄
LOCAL File :OPENFILENAME

.if uMsg == WM_CREATE
invoke CreateMenu
mov hMenu, eax
.if eax
invoke CreatePopupMenu ;创建一级菜单
mov hPopMenu, eax ;保存一级菜单句柄
invoke AppendMenu, hPopMenu, NULL, MENU_ABOUTAUTHOR, addr MenuAboutAuthor ;添加二级菜单
invoke AppendMenu, hPopMenu, NULL, MENU_SELECT, addr MenuSelect ;添加二级菜单
invoke AppendMenu, hPopMenu, NULL, MENU_START, addr MenuStart ;添加二级菜单
invoke AppendMenu, hPopMenu, NULL, MENU_PAUSE, addr MenuPause ;添加二级菜单
invoke AppendMenu, hMenu, MF_POPUP, hPopMenu, addr MenuAbout ;添加一级菜单
.endif
invoke SetMenu, hWin, hMenu ;设置菜单
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,0 ;退出消息循环
.elseif uMsg == WM_COMMAND
.if wParam == MENU_ABOUTAUTHOR
invoke MessageBoxA,hWin,ADDR Author,ADDR ClassName,MB_OK
.elseif wParam == MENU_SELECT ;选择音乐
mov File.lStructSize,sizeof OPENFILENAME
mov eax,hWin
mov File.hwndOwner,eax
mov File.hInstance,0
mov File.lpstrFilter,OFFSET FileFilter
mov File.lpstrCustomFilter,0
mov File.nMaxCustFilter ,0
mov File.nFilterIndex,0
mov File.lpstrFile,OFFSET FilePath
mov File.nMaxFile,MAX_PATH
mov File.lpstrFileTitle,0
mov File.nMaxFileTitle,0
mov File.lpstrInitialDir,0
mov File.lpstrTitle,0
mov File.Flags,0
mov File.nFileOffset,0
mov File.nFileExtension,0
mov File.lpstrDefExt,OFFSET FileFilter
mov File.lCustData,0
mov File.lpfnHook,0
mov File.lpTemplateName,0
invoke GetOpenFileName,addr File
invoke PlayMidiFile,hWin,addr FilePath
.elseif wParam == MENU_START ;播放音乐
invoke PlayMidiFile,hWin,addr FilePath
.elseif wParam == MENU_PAUSE ;暂停音乐
invoke mciSendCommand,MidDeviceID,MCI_CLOSE,0,0
.endif
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam ;调用默认消息处理函数
ret
.endif
xor eax,eax
ret
WndProc endp
; ===============================================
;====================== Start PlayMidiFile Start =====================
PlayMidiFile proc hWin:DWORD,NameOfFile:DWORD
LOCAL mciOpenParms:MCI_OPEN_PARMS,mciPlayParms:MCI_PLAY_PARMS
mov eax,hWin
mov mciPlayParms.dwCallback,eax
mov eax,OFFSET szMIDISeqr
mov mciOpenParms.lpstrDeviceType,eax
mov eax,NameOfFile
mov mciOpenParms.lpstrElementName,eax
invoke mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,ADDR mciOpenParms
mov eax,mciOpenParms.wDeviceID
mov MidDeviceID,eax
invoke mciSendCommand,MidDeviceID,MCI_PLAY,MCI_NOTIFY,ADDR mciPlayParms
ret
PlayMidiFile endp
;======================== End PlayMidiFile End =======================
end start
cnzdgs 2010-01-15
  • 打赏
  • 举报
回复
播放什么音乐?是自己解码还是调API或是加载默认播放器?
先看看这个API:
http://msdn.microsoft.com/en-us/library/dd743680%28VS.85%29.aspx
KingWolfOfSky 2010-01-15
  • 打赏
  • 举报
回复
mark
大熊猫侯佩 2010-01-15
  • 打赏
  • 举报
回复
看一下WINMM和MP3解码,开源论坛应该有不少的。
楼主也不能一点手都不动哦。
zy_800927 2010-01-15
  • 打赏
  • 举报
回复
不知道 不能帮助你了
yeah7725 2010-01-15
  • 打赏
  • 举报
回复
快滴啊~~

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧