Ошибка QueryInterface

Тема в разделе "Библиотеки и интерфейсы", создана пользователем gwest, 22 июн 2009.

  1. gwest

    gwest New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    6
    Хочу получить IDirectSound3DListener и IDirectSound3DBuffer... Создаю первичный и вторичный буферы все отлично работает мелодия воспроизводится... как только добавляю функцию QueryInterface для получения пространственный интерфейсов программа начинает вылетать. Пишу под masm!!!
    Код (Text):
    1.     invoke DirectSoundCreate, 0, addr pDirectSound, 0
    2.  
    3.     dsound SetCooperativeLevel, pDirectSound, Hwnd, DSSCL_PRIORITY
    4.  
    5.    
    6.     mov DsBufDesc.dwSize, sizeof DSBUFFERDESC                
    7.     mov DsBufDesc.dwFlags, DSBCAPS_PRIMARYBUFFER + DSBCAPS_CTRL3D    
    8.     mov DsBufDesc.dwBufferBytes, 0                      
    9.     mov DsBufDesc.dwReserved, 0                          
    10.     mov DsBufDesc.lpwfxFormat, 0                      
    11.  
    12.     dsound CreateSoundBuffer, pDirectSound, ADDR DsBufDesc, ADDR pPrimari, NULL
    13.  
    14.  
    15.  
    16.     mov WaveFormat.wFormatTag,WAVE_FORMAT_PCM                    
    17.     mov WaveFormat.nChannels,1                                
    18.     mov WaveFormat.nSamplesPerSec,22050                      
    19.     mov WaveFormat.wBitsPerSample,16                        
    20.     mov WaveFormat.nBlockAlign,2                                
    21.     mov WaveFormat.nAvgBytesPerSec,44100                    
    22.     mov WaveFormat.cbSize,0
    23.    
    24.     dsbuffer SetFormat, pPrimari, addr WaveFormat
    25.  
    26.     dsbuffer QueryInterface, pPrimari, IID_IDirectSound3DListener, addr pListener
    27.    
    28.     invoke  mmioOpen, ADDR SoundName, NULL, MMIO_ALLOCBUF or MMIO_READ   
    29.     mov     hMmio,eax
    30.      
    31.     mov     WaveInfo.fccType, "EVAW"                                      
    32.     invoke  mmioDescend, hMmio, addr WaveInfo, NULL, MMIO_FINDRIFF
    33.      
    34.     mov     ChunkInfo.ckid," tmf"                                            
    35.     invoke  mmioDescend, hMmio, addr ChunkInfo, addr WaveInfo, MMIO_FINDCHUNK
    36.  
    37.     invoke  mmioRead, hMmio, addr WaveFormat, ChunkInfo.ckSize              
    38.     invoke  mmioAscend, hMmio, addr ChunkInfo, NULL
    39.    
    40.     mov     ChunkInfo.ckid, "atad"                                          
    41.     invoke  mmioDescend, hMmio, addr ChunkInfo, addr WaveInfo, MMIO_FINDCHUNK
    42.    
    43.     mov eax, ChunkInfo.ckSize                                    
    44.     mov DsBufDesc.dwBufferBytes, eax                              
    45.     mov DsBufDesc.dwReserved, 0                                      
    46.     mov DsBufDesc.lpwfxFormat, NULL                                  
    47.     mov DsBufDesc.dwFlags, DSBCAPS_CTRLFREQUENCY + DSBCAPS_CTRLPAN + DSBCAPS_CTRLVOLUME
    48.     mov DsBufDesc.lpwfxFormat,offset WaveFormat
    49.     dsound8 CreateSoundBuffer, pDirectSound, ADDR DsBufDesc, ADDR pBuffer, NULL
    50.  
    51.    
    52.     dsbuffer Lock1, pBuffer, 0, ChunkInfo.ckSize, ADDR S_data, ADDR S_lengte, NULL, 0, 0
    53.     invoke mmioRead, hMmio, S_data, ChunkInfo.ckSize
    54.     dsbuffer Unlock, pBuffer, S_data, S_lengte, NULL, 0
    55.  
    56.     invoke mmioClose,hMmio,NULL
    57.    
    58.     dsbuffer QueryInterface, pBuffer, IID_IDirectSound3DBuffer, addr pD3Buffer
    59.    
    60.     dsbuffer Play, pBuffer, 0, 0, 0
     
  2. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    покажи код макроса dsbuffer
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    gwest
    > Пишу под masm
    Как определены/инициализированы IID_IDirectSound3DListener и IID_IDirectSound3DBuffer?
    Не адрес ли их нужно передавать?
     
  4. gwest

    gwest New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    6
    Да как раз таки передаю адреса просто в коде который скинул не правильно написал... если делать как в коде тогда программа вообще не компилируется, если передавать адрес тогда компилируется без ошибок но сама программа вылетает... если правильно смог определить процес завершается ошибкой: ERROR_SXS_KEY_NOT_FOUND

    ; IDirectSoundBuffer
    ; ----------------------------------------------------------------------------

    IID_IDirectSoundBuffer EQU <{0279AFA85h,04981h,011CEh,{0A5h,021h,000h,020h,0AFh,00Bh,0E5h,060}}>

    ;-----------------------------------------------------------------------------
    ; Вызов методов IDirectSoundBuffer
    ;-----------------------------------------------------------------------------
    dsbuffer MACRO func, this, arglist :VARARG

    IFB <arglist>
    INVOKE [IDirectSoundBufferVtbl. func][eax], this
    ELSE
    INVOKE [IDirectSoundBufferVtbl. func][eax], this, arglist
    ENDIF
    ORG $-3
    pop eax
    push eax
    mov eax,[eax]
    call [IDirectSoundBufferVtbl. func][eax]
    ENDM
    ;=============================================================================
    ; IDirectSoundBuffer Виртуальная таблица методов
    ;=============================================================================
    IDirectSoundBufferVtbl STRUC

    ;IUnknown methods

    STDMETHOD QueryInterface, p3
    STDMETHOD AddRef, p1
    STDMETHOD Release, p1

    ;IDirectSoundBuffer methods

    STDMETHOD GetCaps, p2
    STDMETHOD GetCurrentPosition, p3
    STDMETHOD GetFormat, p4
    STDMETHOD GetVolume, p2
    STDMETHOD GetPan, p2
    STDMETHOD GetFrequency, p2
    STDMETHOD GetStatus, p2
    STDMETHOD Initialize, p3
    STDMETHOD Lock1, p8
    STDMETHOD Play, p4
    STDMETHOD SetCurrentPosition, p2
    STDMETHOD SetFormat, p2
    STDMETHOD SetVolume, p2
    STDMETHOD SetPan, p2
    STDMETHOD SetFrequency, p2
    STDMETHOD Stop, p1
    STDMETHOD Unlock, p5
    STDMETHOD Restore, p1

    IDirectSoundBufferVtbl ENDS

    IID_IDirectSound3DListener EQU <{0279AFA84h,04981h,011CEh,{0A5h,021h,000h,020h,0AFh,00Bh,0E5h,060h}}>
    IID_IDirectSound3DBuffer EQU <{0279AFA86h,04981h,011CEh,{0A5h,021h,000h,020h,0AFh,00Bh,0E5h,060h}}>
     
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    а не нужно ли вот так?

    .data

    II_3DBuffer GUID IID_IDirectSound3DBuffer

    .code
    dsbuffer QueryInterface, pBuffer, ADDR II_3DBuffer, addr pD3Buffer
     
  6. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Откопал пример использования 3D буфера и эффектов, там зациклено на воспроизведение через jmp, поэтому не работает оконная процедура и приложения завершается только через Ctrl+ALT+DEL. Для примера подойдет.
     
  7. gwest

    gwest New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    6
    Самое смешное, что и так тоже пробовал

    Щас буду ковыряться
     
  8. gwest

    gwest New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    6
    А возможно что ошибка в том что я использую библиотеку 9 версии???
    Функция DirectSoundCreate работает отлично но стоит вызвать место нее DirectSoundCreate8, компилятор пишет

    error LNK2001: unresolved external symbol __imp__DirectSoundCreate8@12
    fatal error LNK1120: 1 unresolved externals

    В dsound9.inc
    Код (Text):
    1. ; DirectSound API
    2.  ; ----------------------------------------------------------------------------
    3.  
    4. externdef _imp__DirectSoundCreate@12:ptr p3
    5.  DirectSoundCreate equ <_imp__DirectSoundCreate@12>
    6.  
    7. ; DirectSound 8 и выше
    8.  ; ---------------------------------------------------------------------
    9.  
    10.  externdef _imp__DirectSoundCreate8@12:ptr p3
    11.  DirectSoundCreate8 equ <_imp__DirectSoundCreate8@12>
     
  9. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Насколько помню DirectSound выше восьмой версии нет. В инклудах от 9 версии тоже самое что и в восьмой за исключением двух строк

    DIRECTSOUND_VERSION EQU 00900h

    и

    ;if DIRECTSOUND_VERSION ge 00900h
    DSBFREQUENCY_MAX EQU 200000
    ;else
    ;DSBFREQUENCY_MAX EQU 100000
    ;ENDIF

    ---------
    итого определена лишь другая максимальная частота буфера если версия девятая.

    Работа со звуком в DirectX давно делается через XACT. Файлы directsound в новых sdk старые, просто вкладываются для совместимости.
     
  10. gwest

    gwest New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    6
    2 keYMax
    Можешь подсказать почему я немогу использовать DirectSoundCreate8 или это не существенно?
    Насколько я понял если использую DirectSoundCreate то везде надо использовать макросы dsound, dsbuffer и тп, если DirectSoundCreate8, то dsound8, dsbuffer8...
     
  11. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    gwest
    вот ссылка на три примера + инклуды + либа из dx sdk march 2009
    dsound_masm.zip
    компиляется без проблем и запускается, по крайней мере у меня.
     
  12. gwest

    gwest New Member

    Публикаций:
    0
    Регистрация:
    27 май 2008
    Сообщения:
    6
    keYMax
    Спасибо разобрался, видимо умня библиотека dsound.lib была кривая... Стоило заменить заработало!!! и музыкальный файл весел много из-за этого почемуто не мог буфер создать...