Я только начинаю разбираться с программированием под Win32. Простые приложения получаются. Решил с чужими DLL поработать, но вот проблема: Есть заголовочный файл (на С++) и я никак не могу переделать его в inc файл для АСМа. Никак не врублюсь что-такое callback функции и как их представлять в inc файле и использовать? Например: typedef int (CALLBACK PASCAL * DOACTION)(PSESSION); Насколько я понял - это указатель на функцию, находящуюся в DLL, но как компилятор определяет её адрес, если ни в одном заголовочном файле его нет? Помогите пожалуйста!!!
callback - это общее название процедуры или функции, которая вызывается откуда-то и потом возвращается назад. Например есть таблица, в ней 3-и столбца, и надо чтоб 3-ий=(1-ый)+(2-ой), вот пишешь callback функцию для сложения, и всовываешь в эту таблицу. Короче название это просто. PASCAl - это соглашение о передаче параметров, есть еще CDECL, STDCALL, FASTCALL и др., см. например iczelion'а, там в начале объясняется. но как компилятор определяет её адрес> если ты грузишь DLL динамически (по ходу работы) LoadLibrary, то адрес надо определять самому GetProcAddres, если хочешь чтоб DLL к EXE'шнику сама грузилась, надо утилитой из MASM32 пройтись по DLL, она сделает LIB файл, который ты в исходник укажешь includelib ..., и линкер сам все настроит.
Он никак не определяет её адрес, это работа линкера: либо он свяжет её с функцией в LIB, либо создаст элемент в таблице импорта и тогда указание адреса функции возложится на систему (загрузчик). Далее. Если имеется ввиду callback-функции, то их адрес передаётся в другой модуль как аргумент функции, а в своём модуле адрес этот конечно известен на этапе компиляции. Насколько я понял, тебе это и нужно. Что ж, делаем вроде этого: Код (Text): (masm) typedef PDWORD PSESSION; DoAction proc stdcall pSeccion:PSESSION ... DoAction endp Setup: ; передаём указатель на DoAction как параметр функции ; предполагается, что прототип инициализирующей функции ; описан как например void __stdcall SetCallback(DOACTION pDoActionCbk); mov edx,DoAction invoke SetCallback,edx
Чтобы не приходилось переделывать заголовочные файлы, советую юзать C/C++ компилятор со встроенным ассемблером, например MS Visual C++. Там можно поотключать все лишнее, и будет не хуже MASM'а.
Так я не говорю писать на C, просто использовать возможность компилятора компилировать исходник на ассемблере...
Использую FASM - самый простой, понятный, маленький и красивый (синтаксис) из виденных мною. MASM по синтаксису ближе к C, т.е. как и там многого не видно и не понятно что к чему (детально изучать синтксис нужно), а я люблю, чтобы всё на поверхности было! Библиотечку DLL придется подгружать LoadLibrary! Правильно ли я понял с callback'ами? Делаем подпрограмму DoAction и прописываем в ней всё, что нужно. Далее в основной программе, на этапе инициализации, говорим системе, что мы устанавливаем callback с именем (адресом) DoAction. После чего, при возникновении в системе определенного события происходит вызов (системой) описанной DoAction? Или я гоню? Всем спасибо. Будем биться до последнего!!! Пошел пробовать!