В SDK прочитал как возпроизвезти wav файл. invoke DirectSoundCreate8, 0, pDirectSound, 0 Что такое pDirectSound ???
Указатель на то, что получит указатель на интерфейс при создании экземпляра COM-компонента меня прет: вы что, вообще мсдн не читаете? http://msdn.microsoft.com/en-us/library/bb219693(VS.85).aspx
pDirectSound - это переменная типа DWORD, которая может находится в секции .data или .bss А заполняется она при вызове DirectSoundCreate8
Точнее, после вызова DirectSoundCreate8. Туда кладется указатель на интерфейс IDirectSound (или как его?..)
Спасибо, теперь понятнее. Еще вопрос: Все в томже SDK следующей строкой идет comcall pDirectSound, SetCooperativeLevel, [hwnd], DSSCL_PRIORITY Что такой comcall и DSSCL_PRIORITY
wcools добавлю.. ..и с ДХ если нет понятия ни в ДХ ни в асме, лучше начинать на мсС++ безо всяких промежуточных либ. по директХ версии 2 есть полная дока на русском. практически все, что вам надо там описано. электронного варианта прям щас я не имею. берете мс дх сдк не самой высокой версии, 3, 5, 7 - вполне подойдут. смотрите в папочку с примерами, выбираете попроще из подходящих и перелицовываете во что вам нужно. иначе до 5тницы - 100% только у доброго тов. сдуть или за n-ную сумму. ну вы поняли
wcools Подождите, подождите, вы используете ассемблер fasm? Если да, то comcall - это макрос, который определен в include-файлы %fasmdir%\include\macro\com32.inc Он нужен для вызова COM-метода. pDiretctSound - переменная-указатель на интерфейс (инициализируется при вызове DirectSoundCreate8). SetCooperativeLevel - имя метода интерфейса. далее идут параметры для метода. hwnd - очевидно, handle главного окна. DSSCL_PRIORITY - какой-то флаг. хз. смотрите заголовочный файл и читайте документацию. PS. Если вы ничего не поняли, то изучите "технологию COM" на низком уровне, п потом пользуйтесь макросами. Здесь на сайте есть статьи про COM/ООП.
А вы скажите мне по какому смещению находится указатель на нужный вам метод (напр. SetCooperativeLevel) относительно начала интерфейса и я скажу, как это сделать без макросов. Но в общем виде это выглядит так: Код (Text): mov eax,dword[pDiretctSound] ;; загружаем указатель на интерфейс. mov eax,dword[eax] ;; в EAX - указатель на таблицу виртуальных функций. push param_n push param_1 push param_0 push dword[pDiretctSound] ;; первый параметр - тоже, что и в С++ - this call dword[eax+func_offset*4] ;; вызываем метод. Например, метод Release любого интерфейса можно вызвать так: Код (Text): mov eax,dword[pInterface] ;; загружаем указатель на интерфейс. mov eax,dword[eax] ;; в EAX - указатель на таблицу виртуальных функций. push dword[pInterface] ;; первый параметр - тоже, что и в С++ - this call dword[eax+8*4] ;; вызываем метод. А вы добавьте переменную окружения include с путем к папке include fasm'a и не будет ругаться.
Ой, ошибка в предыдущем посте. не так Код (Text): call dword[eax+8*4] ;; вызываем метод. а так: Код (Text): call dword[eax+2*4] ;; вызываем метод. или так: Код (Text): call dword[eax+8] ;; вызываем метод. По смещению +0 от начала таблицы виртуальных функций любого COM-интерфейса находится указатель на метод QueryInterface. По смещению +4 - указатель на метод AddRef. По смещению +8 - указатель на метод Release.
Помогите с программой. SetCooperativeLevel ниработает ни в какую. inc файлы не могу подключить, fasm всевремя ругается. Вот программа.
Надо именно на fasm. Получилось подключить файлы . Сейчас ошибка ваще непонятная: undefined symbol pDirectSound.handle Ошибка эта на строке comcall pDirectSound,SetCooperativeLevel,NULL,DSSCL_NORMAL А в подключеном файле на макрасе macro comcall object, func, [arg] { common .PARAM_COUNT = 1 if ~ arg eq reverse .PARAM_COUNT = .PARAM_COUNT + 1 push dword arg common end if if defined func#% if func#% <> 0 if .PARAM_COUNT <> func#% display 'Param miscount ( ',`object,',',`func, ' )',13,10 end if end if end if mov eax, [object#.#handle] push eax mov eax, [eax] call [eax + object#.#handle#.#func] } Мне кажется, что это макрос какойто неправельный???
Помогите пожалуйста. Для меня очень важно написать эту программу. Может кому не лень написать блок возпроизведения?
вроде по русски написал - возьмите простой С пример из старого СДК. в более поздних С примеров нету добейтесь рабочести на С (можно и на ++, но без классов) потом уже переводите на асм. с С на асм перевести, надеюсь, сможете? структуры и что как вызывается - смотрите в хидерах. в С части. и это, не понимаете в макросах - не пользуйтесь ими. понимаете средне и даже неплохо - пользуйтесь слегка и осторожно. меньше потеть на отладке будете