Зачем. Ошибка всеравно не в структуре программы. Не работает макрос comcall. Типа я знаю что писать, но не знаю как. ЗЫ: У примера из SDK небыло шансов скомпилироватся.
Где??? Структура такая: 1. Создать объект DirectSound. 2. Установить кооперацию. ........... Второе действие не могу реализовоть из за ошибки на строке (строка из примера!!!). Строка использует макрос, на который тоже указывает fasm. Каким тогда чудесным образом может быть ошибка в структуре в одной строке??? %) По поводу обхода макроса: [eax+object#.#proc] Что означает #.#proc ???
Молодой человек. Откройте, пожалуйста, папку %fasmroot%\examples и поищите там примеры ddraw и usecom. Там все ОЧЕНЬ просто и чем тут ждать чуда, может стоит чуточку подумать самому?..
Дак уж долго думаю, не помогает ( . Если не трудно, напишите ктонибудь как мне применить SetCooperativeLevel к pDirectSound. Я пробовал как в примере: comcall pDirectSound,SetCooperativeLevel,NULL,DSSCL_NORMAL - Выдает ошибку. Пробовал так: mov eax,dword[pDirectSound] mov eax,dword[eax] push DSSCL_NORMAL push [hwnd] push SetCooperativeLevel push dword[pDiretctSound] call dword[eax+func_offset*4] К строке выдает ошибку undefined symbol , хотя подключен файл dsound8.inc Правильно ли я понял: чтобы использовать метод, мне нужно указать его адрес в виртуальной таблице методов??? таблице
wcools Code (Text): mov eax,dword[pDirectSound] mov eax,dword[eax] push DSSCL_NORMAL push [hwnd] push dword[pDiretctSound] call dword[eax+xxx*4] Где: xxx - смещение функции SetCooperativeLevel относительно начала таблицы методов интерфейса IDirectSound
Блин ну я не знаю!.. Неужели правда не ясно? Под рукой нет SDK. И фасма тоже нет. И пишу я со смартфона) берете SDK, ищите там интерфейс DirectSound. Далее его объявляете: Code (Text): interface DirectSound,\ ... SetCooperativeLevel,\ ... Далее объявляете Code (Text): pDirectSound DirectSound и что-то вроде Code (Text): invoke DirectSoundCreate,0,pDirectSound,0 ... comcall pDIrectSound,SetCooperativeLevel,[hWnd],DSSCL_NORMAL ... Et cetera.
wcools Похоже что ты скачал пакет для фасма в котором есть инклуды для Direct3D и directsound. Он был написан в далеком 2005 году и фасм для компиляции там используется старый. Старее чем 1.64, поэтому те примеры которые там идут, без проблем скомпиляются на старой версии фасма. Под новую мне было править лень, там косяки с макросами, если кто подскажет как поменять под новую версию я исправлю.
Чето я такое в примере не видел. Символ в символ - такуюже строки пишу и не работает ((( Может быть. Кста вот пример из SDK
Я смотрю все втуне... Значит перед секцией данных пишите: Code (Text): interface DirectSound,\ QueryInterface,\ AddRef,\ Release,\ CreateSoundBuffer,\ GetCaps,\ DuplicateSoundBuffer,\ SetCooperativeLevel,\ Compact,\ GetSpeakerConfig,\ SetSpeakerConfig,\ Initialize,\ VerifyCertification Ниже pDirectSound dw ? меняете на pDirectSound DirectSound. Ну и вместо comcall DirectSoundCreate8 пишите cominvk DirectSoundCreate. Бином Ньютона, не иначе!..
wcools Приложеный пример это из пакета directx 8.1 for fasm. Компилится старой версией фасма, я бы не стал морочить голову пытаясь написать новые инклуды.
В догонку, новый макрос comcall был введен взамен того что присутстововал в fasm (cominvk) чтобы проще было переделывать инклуды от пакета для Masm. Отсюда все эти грабли.
Огромное спасибо. Заработало Еще вопросы: Что значит interface DirectSound,\ QueryInterface,\ AddRef,\......... ............. Это же виртуальная таблица методов??? Чеото не работае чтение файла; конкретно программа вылетает из-за ф-й cominvk pDSSample,Lock1,0,[ChInf.ckSize],S_data,S_lengte,0,0,0 cominvk pDSSample,Unlock,[S_data],[S_lengte],0,0 Из за чего это может быть? Вот весь кусок загрузки файла: Code (Text): ;--------------Читаем файл------------------- invoke GetOpenFileName,fopen ;Функция вызова диалога открытия файла. mov [hM],eax ;Запоминаем указатель на открытый файл в hM invoke mmioOpen,fname,0,MMIO_READ ;Возвращает (нестандартный) иденти-фикатор открытого файла в fname mov [ChInf.fccType],"WAVE" ;инициализирование значение поля .fccType структуры MMCKINFO, чтобы функция знала тип искомого блока. invoke mmioDescend,[hM],ChInf,0,MMIO_FINDRIFF ;Чтение заголовка файла mov [ChInf.ckid],"fmt" ;инициализирование значение поля ckid invoke mmioDescend,[hM],ChInf,WInf,MMIO_FINDCHUNK ;чтение Формата файла в заголовке WAVE invoke mmioRead,[hM],WavFt,[ChInf.ckSize] ;Считывание формата invoke mmioAscend,[hM],ChInf,0 ;Закрываем вложенный блок mov [ChInf.ckid],"data" ;инициализирование значение поля ckid (читаем звуковые данные) invoke mmioDescend,[hM],ChInf,WInf,MMIO_FINDCHUNK ;Читаем данные ;-------------------------------------------- ;--------------Заполнение WavFt - структуры типа буфера-------------- mov [WavFt.wFormatTag],1 ;Команда формата mov [WavFt.nChannels],2 ;Число каналов mov [WavFt.nSamplesPerSec],8000 ;Частота mov [WavFt.nAvgBytesPerSec],32000 ;Байт в секунду mov [WavFt.nBlockAlign],4 ;Выравнивание данных в data-чанке mov [WavFt.wBitsPerSample],16 ;-------------------------------------------------------------------- ;--------------Заполнение BuferT - структуры для создания буфера----- mov [BuferT.dwSize],sizeof.DSBUFFERDESC ;Размер структуры mov [BuferT.dwFlags],DSBCAPS_GLOBALFOCUS ;Флаг mov eax,[ChInf.ckSize] ;Кидаем в eax размер данных mov [BuferT.dwBufferBytes],eax ;Размер буфера lea eax,[WavFt] mov [BuferT.lpwfxFormat],eax ;Указатель на заполненную структуру WAVEFORMATEX ;-------------------------------------------------------------------- cominvk pDirectSound,CreateSoundBuffer,BuferT,pDSSample,0 ;Создаем буфер cominvk pDSSample,Lock1,0,[ChInf.ckSize],S_data,S_lengte,0,0,0 invoke mmioRead,[hM],[S_data],[ChInf.ckSize] cominvk pDSSample,Unlock,[S_data],[S_lengte],0,0
wcools > Что значит interface DirectSound,\ > QueryInterface,\ > AddRef,\......... > ............. Читайте статьи про COM/OOP.