PDA

Просмотр полной версии : [Программа] Пример использования MCI.


Ivan_32
16.12.2008, 07:16
Простенький пример использования MCI для повелевания CDRom.
Приведу код и файл проекта со всеми потрохами. ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Все для RadASM + MASMv9

CDRomEject.asm

.386
.model flat,stdcall
option casemap:none

include CDRomEject.inc
include winmm.inc
includelib winmm.lib
.data
mMess db "Open CD/DVD device?"
mmS0 db "Set cdaudio door open wait",0
mmS1 db "Set cdaudio door closed wait",0
Abt db "Just a sample of using MCI device by Ivan_32.",0
AbtC db "About",0
.code

start:

invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
invoke InitCommonControls
mov CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG

mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,0
mov wc.lpszClassName,offset ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateDialogParam,hInstance,IDD_DIALOG,NULL,addr WndProc,NULL
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.BREAK .if !eax
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw
mov eax,msg.wParam
ret

WinMain endp
ThreadProcOpen proc lparam:DWORD
invoke mciSendString,addr mmS0,0,0,0
ret
ThreadProcOpen endp
ThreadProcClose proc lparam:DWORD
invoke mciSendString,addr mmS1,0,0,0
ret
ThreadProcClose endp
ThreadProcAbout proc lparam:DWORD
invoke MessageBox,0,addr Abt,addr AbtC,MB_OK
ret
ThreadProcAbout endp
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL ps:PAINTSTRUCT,hDC:HDC,pRect:RECT
mov eax,uMsg
.if eax==WM_INITDIALOG
push hWin
pop hWnd
invoke SetLayeredWindowAttributes,[hWnd],0,200,LWA_ALPHA
.elseif eax==WM_COMMAND
mov eax,wParam
and eax,0FFFFh
.if eax==IDC_BTN1
invoke CreateThread,0,20,addr ThreadProcOpen,0,0,0
.elseif eax==IDC_BTN2
invoke CreateThread,0,20,addr ThreadProcClose,0,0,0
.endif
.if eax==IDC_BTN3
invoke CreateThread,0,20,addr ThreadProcAbout,0,0,0
.endif
; .elseif eax==WM_SIZE
.elseif eax==WM_LBUTTONDOWN
invoke ReleaseCapture
invoke SendMessage,hWnd,WM_SYSCOMMAND,61458,0
.elseif eax==WM_PAINT
invoke BeginPaint,hWnd,addr ps
invoke GetWindowDC,hWnd
mov hDC,eax
mov pRect.left,0
mov pRect.right,122
mov pRect.top,0
mov pRect.bottom,144
invoke FillRect,hDC,addr pRect,COLOR_WINDOW+5
invoke EndPaint,hWnd,addr ps
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWin
.elseif uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret

WndProc endp

end start

CDRomEject.inc

include windows.inc
include user32.inc
include kernel32.inc
include shell32.inc
include comctl32.inc
include comdlg32.inc

includelib user32.lib
includelib kernel32.lib
includelib shell32.lib
includelib comctl32.lib
includelib comdlg32.lib

WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

IDD_DIALOG equ 1000
IDC_BTN1 equ 1001
IDC_BTN2 equ 1002
IDC_BTN3 equ 1003
.const

ClassName db 'DLGCLASS',0
AppName db 'Dialog as main',0
AboutMsg db 'MASM32 RadASM Dialog as main',13,10,'Copyright © MASM32 2001',0

.data?

hInstance dd ?
CommandLine dd ?
hWnd dd ?


Проект самого диалога был создан автоматикой но самому его запомнить тоже несложно.

Как видно из кода, некому MCI устройству посылаются команнды а именно строки mmS0 и mmS1. Устройство их парсит и делает то что приказано.