callbacks: из си в ассемблер

Тема в разделе "WASM.BEGINNERS", создана пользователем Quwestor, 16 сен 2005.

  1. Quwestor

    Quwestor New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    4
    Я только начинаю разбираться с программированием под Win32. Простые приложения получаются. Решил с чужими DLL поработать, но вот проблема:

    Есть заголовочный файл (на С++) и я никак не могу переделать его в inc файл для АСМа. Никак не врублюсь что-такое callback функции и как их представлять в inc файле и использовать?

    Например:



    typedef int (CALLBACK PASCAL * DOACTION)(PSESSION);



    Насколько я понял - это указатель на функцию, находящуюся в DLL, но как компилятор определяет её адрес, если ни в одном заголовочном файле его нет?



    Помогите пожалуйста!!!
     
  2. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    callback - это общее название процедуры или функции, которая вызывается откуда-то и потом возвращается назад.

    Например есть таблица, в ней 3-и столбца, и надо чтоб 3-ий=(1-ый)+(2-ой), вот пишешь callback функцию для сложения, и всовываешь в эту таблицу. Короче название это просто.



    PASCAl - это соглашение о передаче параметров, есть еще CDECL, STDCALL, FASTCALL и др., см. например iczelion'а, там в начале объясняется.



    но как компилятор определяет её адрес>

    если ты грузишь DLL динамически (по ходу работы) LoadLibrary, то адрес надо определять самому GetProcAddres, если хочешь чтоб DLL к EXE'шнику сама грузилась, надо утилитой из MASM32 пройтись по DLL, она сделает LIB файл, который ты в исходник укажешь includelib ..., и линкер сам все настроит.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Он никак не определяет её адрес, это работа линкера: либо он свяжет её с функцией в LIB, либо создаст элемент в таблице импорта и тогда указание адреса функции возложится на систему (загрузчик).



    Далее. Если имеется ввиду callback-функции, то их адрес передаётся в другой модуль как аргумент функции, а в своём модуле адрес этот конечно известен на этапе компиляции.



    Насколько я понял, тебе это и нужно. Что ж, делаем вроде этого:
    Код (Text):
    1. (masm)
    2. typedef PDWORD PSESSION;
    3. DoAction proc stdcall pSeccion:PSESSION
    4.   ...
    5. DoAction endp
    6.  
    7. Setup:
    8.   ; передаём указатель на DoAction как параметр функции
    9.   ; предполагается, что прототип инициализирующей функции
    10.   ; описан как например void __stdcall SetCallback(DOACTION pDoActionCbk);
    11.   mov  edx,DoAction
    12.   invoke  SetCallback,edx
     
  4. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    Чтобы не приходилось переделывать заголовочные файлы, советую юзать C/C++ компилятор со встроенным ассемблером, например MS Visual C++. Там можно поотключать все лишнее, и будет не хуже MASM'а.
     
  5. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    чтобы вообще ничего не переделывать, можно писать на VB :)
     
  6. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    Так я не говорю писать на C, просто использовать возможность компилятора компилировать исходник на ассемблере...
     
  7. Quwestor

    Quwestor New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2005
    Сообщения:
    4
    Использую FASM - самый простой, понятный, маленький и красивый (синтаксис) из виденных мною. MASM по синтаксису ближе к C, т.е. как и там многого не видно и не понятно что к чему (детально изучать синтксис нужно), а я люблю, чтобы всё на поверхности было!



    Библиотечку DLL придется подгружать LoadLibrary!

    Правильно ли я понял с callback'ами?

    Делаем подпрограмму DoAction и прописываем в ней всё, что нужно. Далее в основной программе, на этапе инициализации, говорим системе, что мы устанавливаем callback с именем (адресом) DoAction. После чего, при возникновении в системе определенного события происходит вызов (системой) описанной DoAction? Или я гоню?



    Всем спасибо. Будем биться до последнего!!! Пошел пробовать!
     
  8. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125


    Правильно.