青玄 发表于 2014-7-29 10:31:57

关于光驱的打开与关闭

本帖最后由 青玄 于 2014-7-29 10:38 编辑

                                                                                                                .386
                                                                                                                .model flat,stdcall
                                                                                                                option casemap:none
include windows.inc
include winmm.inc
includelib winmm.lib;
include gdi32.inc
includelib gdi32.lib
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
include comctl32.inc
includelib comctl32.lib
DLG_MAIN equ   1000h
ICO_MAIN equ   2000h
   .data?
hInstance dd ?;定义模块句柄
dwReSize dd ?
hDevice   dd ?
hWinMain dd ?
                                                                                                      .const
musicName db "ring.wav",0
szDevice db " CDAUDIO",0;CDAUDIO
                                                                                                      .code
_procPlay proc
   local @stMCIOpen:MCI_OPEN_PARMS
   LOCAL   @stMCIPlay:MCI_PLAY_PARMS
   local@stMCIClose:MCI_GENERIC_PARMS
   mov @stMCIOpen.lpstrDeviceType,offset szDevice
   mov @stMCIOpen.lpstrElementName,offset musicName;musicName应该就是音乐文件名吧。
   invoke mciSendCommand,NULL,MCI_OPEN,MCI_OPEN_TYPE,addr @stMCIOpen
   ;mciSendCommand发送消息给MCI设备
   mov eax,@stMCIOpen.wDeviceID
   mov hDevice,eax
    mov eax,hWinMain
   mov @stMCIPlay.dwCallback,eax
   invokemciSendCommand,MCI_ALL_DEVICE_ID,MCI_SET,MCI_SET_DOOR_OPEN,addr @stMCIOpen;打开光驱
   
    mov eax,hWinMain
   mov @stMCIClose.dwCallback,eax
   
   invoke mciSendCommand, addr hDevice, MCI_CLOSE,NULL, NULL                ;关闭光驱
   ret
_procPlay endp
start:
call _procPlay
invoke ExitProcess,NULL
end start大神们! 这个程序执行后只能打开光驱,却不能关闭光驱啊! 但是我明明调用了关闭的函数啊! 这是怎么回事儿啊!还请大神指教指教!

wiliam 发表于 2014-7-29 10:31:58

青玄兄,问题解决了研究了一晚上,我想 源码贴出来和大家一起分享吧,让大家一起运行试试
.386
   .model flat,stdcall
   option casemap:none
include windows.inc
include winmm.inc
includelib winmm.lib;
include gdi32.inc
includelib gdi32.lib
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
include comctl32.inc
includelib comctl32.lib
DLG_MAIN equ   1000h
ICO_MAIN equ   2000h
   .data?
hInstance dd ?;定义模块句柄
dwReSize dd ?
hDevice   dd ?
hWinMain dd ?
DeviceIDC dd ?
   .const
szDevice db " CDAUDIO",0;CDAUDIO
   .code
_procPlay proc
   local @stMCIOpen:MCI_OPEN_PARMS
   LOCAL   @stMCIPlay:MCI_PLAY_PARMS
   invokeRtlZeroMemory,addr @stMCIOpen,sizeof @stMCIOpen
   mov @stMCIOpen.lpstrDeviceType,offset szDevice
   invoke mciSendCommand,NULL,MCI_OPEN,MCI_OPEN_TYPE,addr @stMCIOpen
   ;mciSendCommand发送消息给MCI设备
mov eax,@stMCIOpen.wDeviceID;;*******mov返回的设备名称
push eax
pop DeviceIDC;*****传给DeviceIDC
   invokemciSendCommand,MCI_ALL_DEVICE_ID,MCI_SET,MCI_SET_DOOR_OPEN,NULL
   call _CloseMP3
   ret
_procPlay endp
;************************************************* 关闭CD部分
_CloseMP3 proc _hwnd
local@stMCIClose:MCI_GENERIC_PARMS
invoke RtlZeroMemory ,addr @stMCIClose,sizeof @stMCIClose
mov @stMCIClose.dwCallback,NULL
invoke mciSendCommand, DeviceIDC ,MCI_SET,MCI_SET_DOOR_CLOSED,0
invoke mciSendCommand,DeviceIDC ,MCI_CLOSE,MCI_WAIT,0
ret
_CloseMP3 endp
;*********************************
;***********主程序部分*********
start:
call _procPlay
invoke ExitProcess,NULL
end start

青玄 发表于 2014-7-29 17:01:19

wiliam 发表于 2014-7-29 16:39
青玄兄,问题解决了研究了一晚上,我想 源码贴出来和大家一起分享吧,让大家一起运行试试
.386
   .model ...

恩恩! 好的!{:2_27:}

网络学习 发表于 2014-8-1 01:11:37

相当不错   厉害啊

Happy19920311 发表于 2014-8-3 09:56:24

厉害

一抹 发表于 2014-8-4 02:32:28

{:5_91:} 看看 看看

cable5881 发表于 2014-8-4 11:13:19

楼主真牛逼:lol::lol::lol:
页: [1]
查看完整版本: 关于光驱的打开与关闭