Консультация № 55017
11.09.2006, 13:18
0.00 руб.
0 3 2
Добрый день, у меня возникла проблема со следующей функцией PlaySound(LPCSTR pszSound,HMODULE hmod, DWORD fdwSound ) заданный звук не проигрывается есть только звук по умолчанию(щелчек), если кто то с этим сталкивался то разьясните поподробнее, и если не сложно то обьясните и как понимать вот это SND_FILENAME-The pszSound parameter is a filename

Приложение:
.386.model flat,stdcalloption casemap:noneWinMain proto :DWORD,:DWORD,:DWORD,:DWORDinclude d:\all\lang!\masm32\include\windows.incinclude d:\all\lang!\masm32\include\winmm.incinclude d:\all\lang!\masm32\include\gdi32.incinclude d:\all\lang!\masm32\include\user32.incincludelib d:\all\lang!\masm32\lib\user32.libinclude d:\all\lang!\masm32\include\kernel32.incincludelib d:\all\lang!\masm32\lib\kernel32.libincludelib d:\all\lang!\masm32\lib\winmm.libincludelib d:\all\lang!\masm32\lib\gdi32.libRGB macro red,green,blue xor eax,eax mov ah,blue shl eax,8 mov ah,green mov al,red endm.DATAClassName db "SimpleWinClass",0AppName db "Metronom",0OurText db "Win32 assembly is great and easy!",0MBoxText db"Just Start!",0MBoxCap db "start!",0playFileCreate db ‘d:\all\lang!\masm32\work\CREATE.wav‘,0FontName db "script",0TestString db "TEST",0.DATA?hInstance HINSTANCE ?CommandLine LPSTR ?.CODEstart: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eaxWinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND 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,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL 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 CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ hInst,NULL mov hwnd,eax 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 retWinMain endpWndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT LOCAL hfont:HFONT local TextColor:DWORD .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke GetClientRect,hWnd, ADDR rect invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, \ DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint,hWnd, ADDR ps .ELSEIF uMsg==WM_CREATE invoke PlaySoundA,ADDR playFileCreate,NULL,SND_SYNC or SND_FILENAME;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! invoke MessageBox ,NULL, ADDR MBoxText,ADDR MBoxCap,MB_OK .ELSEIF uMsg==WM_LBUTTONDOWN invoke PlaySoundA,ADDR playFileCreate,NULL,SND_ASYNC cmp eax,0 je fin invoke MessageBox ,NULL, ADDR MBoxText,ADDR MBoxCap,MB_OK fin: .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax, eax retWndProc endpend start

Обсуждение

Неизвестный
11.09.2006, 18:00
общий
это ответ
Здравствуйте, All!
SND_FILENAME - это флаг, который означает, что строка, переданная в первом параметре является именем файла, а не, к примеру, идентификатором ресурса...
Так что, в первый раз вы вызываете функцию правильно, во второй раз - нет.
давно
Посетитель
7438
7205
11.09.2006, 18:37
общий
это ответ
Здравствуйте, All!
Немного подправлю предыдущего эксперта
Смотрим сначала описание параметра fdwSound из MSDN (см приложение)
SND_ALIAS говорит о том, что заданное имя должно интерпретироваться явно как системное событие (например, WindowsLogon - т.е. должен звучать звук, как при загрузке);
SND_FILENAME - явно как имя файла;
SND_RESOURCE - как идетификатор ресурса
Если не задано ничего, то сначала ищется ассоциация (типа как SND_ALIAS), затем ищется файл с указанным именем (как SND_FILENAME).
Т.о., в указанном примере ошибки нет. По любому, будет проигрываться файл с указанным именем.

PS Программа вполне рабочая. У меня работает.
Если не проигрывается, попробуй проиграть из текущего каталога (имя задать без пути)

Приложение:
Three flags in fdwSound (SND_ALIAS, SND_FILENAME, and SND_RESOURCE) determine whether the name is interpreted as an alias for a system event, a filename, or a resource identifier. If none of these flags are specified, PlaySound searches the registry or the WIN.INI file for an association with the specified sound name. If an association is found, the sound event is played. If no association is found in the registry, the name is interpreted as a filename.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
15.09.2006, 13:32
общий
Загляни в реестр HKCU\AppEvents\Schemes\Apps\.DefaultЭто твоя звуковая схема.Имена разделов и есть системные события.Зайдя вовнутрь, найдешь имена звуковых файлов.Кстати, попробуй взять какой-нибудь стандартный звук и проиграть своей программой.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа