Всем привет! Обращаюсь к вам, так как уже не знаю в чем проблема.. Я пишу отключение/изменение громкости микшера. Сначала все писалось на Visual C++ - все работало отлично, переписываю на FASM - появляются косяки, т.е. не работает. Я определил, что ф-ция mixerGetControlDetails возвращает ошибку. Вроде уже все просмотрел, сверял, глядел в отладчике передаваемые структуры.. Посмотрите, пожалуйста, может кто найдет, в чем ошибка, уже 2 дня долбаюсь.. Код на C++: Код (Text): #undef UNICODE #include <windows.h> #include <mmsystem.h> HMIXER hMixer; MIXERLINE ml; MIXERLINECONTROLS mlc; MIXERCONTROL mc; MIXERCONTROLDETAILS mcd; DWORD Volume; MMRESULT Ret; void main (void) { Ret = mixerOpen(&hMixer, 0, NULL, NULL, 0); if (Ret != MMSYSERR_NOERROR) return; ml.cbStruct = sizeof(ml); ml.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; Ret = mixerGetLineInfo((HMIXEROBJ)hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE); if (Ret != MMSYSERR_NOERROR) return; mlc.cbStruct = sizeof(mlc); mlc.dwLineID = ml.dwLineID; mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE; mlc.cControls = 1; mlc.cbmxctrl = sizeof(mc); mlc.pamxctrl = &mc; mc.cbStruct = sizeof(mc); Ret = mixerGetLineControls((HMIXEROBJ)hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (Ret != MMSYSERR_NOERROR) return; mcd.cbStruct = sizeof(mcd); mcd.cbDetails = sizeof(Volume); mcd.paDetails = &Volume; mcd.dwControlID = mc.dwControlID; mcd.cChannels = 1; mixerGetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_GETCONTROLDETAILSF_VALUE); Volume = !Volume; mixerSetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE); PlaySound(TEXT("c:\\windows\\media\\start.wav"), NULL, SND_FILENAME | SND_ASYNC); mixerClose(hMixer); } Код на FASM: Код (Text): format pe gui 4.0 entry start include 'include\win32a.inc' ;-------------------- struct MIXERCONTROL cbStruct dd ? dwControlId dd ? dwControlType dd ? fdwControl dd ? cMultipleItems dd ? szShortName db 16 dup (?) szName db 64 dup (?) Bounds dd 6 dup (?) Metrics dd 6 dup (?) ends struct MIXERCONTROLDETAILS cbStruct dd ? dwControlId dd ? cChannels dd ? cMultipleItems dd ? cbDetails dd ? paDetails dd ? ends struct MIXERLINE cbStruct dd ? dwDestination dd ? dwSource dd ? dwLineId dd ? fdwLine dd ? dwUser dd ? dwComponentType dd ? cChannels dd ? cConnections dd ? cControls dd ? szShortName db 16 dup (?) szName db 64 dup (?) dwType dd ? dwDeviceId dd ? wMid dw ? wPid dw ? vDriverVersion dd ? szPname db 32 dup (?) ends struct MIXERLINECONTROLS cbStruct dd ? dwLineId dd ? dwControlType dd ? cControls dd ? cbmxctrl dd ? pamxctrl dd ? ends ;-------------------- section '.data' data readable writeable dwD dd 0 ml MIXERLINE mlc MIXERLINECONTROLS mc MIXERCONTROL mcd MIXERCONTROLDETAILS hObject dd ? hEvent dd ? hThread dd ? hMixer dd ? ;-------------------- section '.code' code readable executable start: xor ebx, ebx call ChangeVolume push ebx call [ExitProcess] ;-------------------- proc ChangeVolume xor ebx, ebx push ebx push ebx push ebx push ebx push hMixer call [mixerOpen] test eax, eax jnz exitproc mov [ml.cbStruct], sizeof.MIXERLINE mov [ml.dwComponentType], 4 push 3 push ml push [hMixer] call [mixerGetLineInfo] test eax, eax jnz exitproc mov [mlc.cbStruct], sizeof.MIXERLINECONTROLS mov eax, [ml.dwLineId] mov [mlc.dwLineId], eax mov [mlc.dwControlType], 20010002h mov [mlc.cControls], 1 mov [mlc.cbmxctrl], sizeof.MIXERCONTROL mov [mlc.pamxctrl], mc mov [mc.cbStruct], sizeof.MIXERCONTROL push 2 push mlc push [hMixer] call [mixerGetLineControls] test eax, eax jnz exitproc mov [mcd.cbStruct], sizeof.MIXERCONTROLDETAILS mov [mcd.cbDetails], 4 mov [mcd.paDetails], dwD mov eax, [mc.dwControlId] mov [mcd.dwControlId], eax mov [mcd.cChannels], 1 push ebx push mcd push [hMixer] call [mixerGetControlDetails] test eax, eax jnz exitproc ;; СЮДА УЖЕ НЕ ИДЕТ. ОШИБКА mov eax, [dwD] mov eax, 0 mov [dwD], eax push ebx push mcd push [hMixer] call [mixerSetControlDetails] push [hMixer] call [mixerClose] exitproc: ret endp ;-------------------- section '.idata' import data readable writeable library\ kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ gdi32, 'gdi32.dll',\ winmm, 'winmm.dll' import winmm,\ mixerOpen, 'mixerOpen',\ mixerClose, 'mixerClose',\ mixerGetLineInfo, 'mixerGetLineInfoA',\ mixerGetLineControls, 'mixerGetLineControlsA',\ mixerGetControlDetails, 'mixerGetControlDetailsA',\ mixerSetControlDetails, 'mixerSetControlDetails' include 'include\apia\kernel32.inc' include 'include\apia\user32.inc' include 'include\apia\gdi32.inc'
Все дело в том, что ты работаешь с выключением звука (MIXERCONTROL_CONTROLTYPE_MUTE) А по терминологии Microsoft (да и вообще логично), когда звук выключен то в переменной должно быть TRUE Соответственно: вместо -- mov eax, 0 надо -- mov eax, 1 P.S. Ошибок нет. Все работает.
GMax Спасибо за ответ. Ты выполнял этот код? Если да, то я ничего не понимаю - mixerGetControlDetails у меня возвращает 1, т.е. ошибку и ничего не изменяет, только что проверил. Да, насчет mov eax, 0 - действительно косяк, но управление до него все равно не доходит.
Land12 Код на моей машине выполняется правильно (оба варианта). Может дело в версии Fasm? Твой код компилил версией 1.67 Лично мне Masm больше нравится
GMax Да, 1.67. Я сначала думал о выравнивании структур и их размере, но в отладчике все как и в сишном варианте. Видно, надо будет действительно на MASM'е писать.