когда я пытаюсь вызывать каллбак из функции — компилятор ругается
о не возможности преобразовать типы. Я так думаю, что компилятор не может вычислить
адрес ф-ции. Если эту ф-ю вынести вверх за пределы класса вообще — всё прекпасно работает.
Может как то через this нужно делать?
Здравствуйте, Vamp, Вы писали:
V>Здравствуйте, sincosltd, Вы писали:
S>>Такой вопрос — S>>может ли функция класса быть каллбаком? V>Oh boy! V>Поиском не пробовал воспользоваться?
пробовал, и варианты ответов пробовал — толку ноль
проблема в том что мне нужно передать в ДиректХ функцию — каллбак :
hRet = dd7->EnumDisplayModes(DDEDM_REFRESHRATES,NULL,(void*) hwnd,EnumDisplayModes);
EnumDisplayModes — ожидается таким как его придумали разработчики директа
и всякие уловки котроые предлагались — передача адреса обьекта итд не проходят...
Статик тоже не помогает...
вот что пишет компилятор:
Cannot convert 'long (__stdcall * (_closure )(_DDSURFACEDESC2 *,void *))(_DDSURFACEDESC2 *,void *)' to 'long (__stdcall *)(_DDSURFACEDESC2 *,void *)' in function ...
вопрос как преобразовать?
Re[3]: CALLBACK - функция член класса
От:
Аноним
Дата:
21.11.03 21:32
Оценка:
Здравствуйте, sincosltd, Вы писали:
S>Здравствуйте, Vamp, Вы писали:
V>>Здравствуйте, sincosltd, Вы писали:
S>>>Такой вопрос — S>>>может ли функция класса быть каллбаком? V>>Oh boy! V>>Поиском не пробовал воспользоваться? S>пробовал, и варианты ответов пробовал — толку ноль
S>проблема в том что мне нужно передать в ДиректХ функцию — каллбак : S>hRet = dd7->EnumDisplayModes(DDEDM_REFRESHRATES,NULL,(void*) hwnd,EnumDisplayModes);
S>EnumDisplayModes — ожидается таким как его придумали разработчики директа S>и всякие уловки котроые предлагались — передача адреса обьекта итд не проходят... S>Статик тоже не помогает... S>вот что пишет компилятор:
S>Cannot convert 'long (__stdcall * (_closure )(_DDSURFACEDESC2 *,void *))(_DDSURFACEDESC2 *,void *)' to 'long (__stdcall *)(_DDSURFACEDESC2 *,void *)' in function ...
S>вопрос как преобразовать?
Покажи, как ты объявляешь свой callback
и место, где ты его используешь.
Здравствуйте, sincosltd, Вы писали:
S>Такой вопрос — S>может ли функция класса быть каллбаком?
... S>когда я пытаюсь вызывать каллбак из функции — компилятор ругается S>о не возможности преобразовать типы. Я так думаю, что компилятор не может вычислить S>адрес ф-ции. Если эту ф-ю вынести вверх за пределы класса вообще — всё прекпасно работает. S>Может как то через this нужно делать?
Вот так можно, но это непереносимо и наглый хак, хотя идея из ATL
Здравствуйте, Yess, Вы писали:
Y>Здравствуйте, sincosltd, Вы писали:
S>>Такой вопрос — S>>может ли функция класса быть каллбаком? Y>... S>>когда я пытаюсь вызывать каллбак из функции — компилятор ругается S>>о не возможности преобразовать типы. Я так думаю, что компилятор не может вычислить S>>адрес ф-ции. Если эту ф-ю вынести вверх за пределы класса вообще — всё прекпасно работает. S>>Может как то через this нужно делать?
Y>Вот так можно, но это непереносимо и наглый хак, хотя идея из ATL
<...>
По-моему применительно к CreateThread этот хак не стоит применять. У ThreadProc и так есть параметр LPVOID lpParameter. С другой стороны, для любых других применений требуется настройка, так как первый параметр функции (который заменяется на pThis) нужно где-то сохранять (в классе ? но тогда он должен быть написан специально). Короче, техника полезная, но использовать её стоит только когда "сильно прижмёт".
Здравствуйте, sincosltd, Вы писали:
S>Здравствуйте, Vamp, Вы писали:
V>>Здравствуйте, sincosltd, Вы писали:
S>>>Такой вопрос — S>>>может ли функция класса быть каллбаком? V>>Oh boy! V>>Поиском не пробовал воспользоваться? S>пробовал, и варианты ответов пробовал — толку ноль
S>проблема в том что мне нужно передать в ДиректХ функцию — каллбак : S>hRet = dd7->EnumDisplayModes(DDEDM_REFRESHRATES,NULL,(void*) hwnd,EnumDisplayModes);
S>EnumDisplayModes — ожидается таким как его придумали разработчики директа S>и всякие уловки котроые предлагались — передача адреса обьекта итд не проходят... S>Статик тоже не помогает... S>вот что пишет компилятор:
S>Cannot convert 'long (__stdcall * (_closure )(_DDSURFACEDESC2 *,void *))(_DDSURFACEDESC2 *,void *)' to 'long (__stdcall *)(_DDSURFACEDESC2 *,void *)' in function ...
S>вопрос как преобразовать?
Очень хочется ругаться матом. Одна из стандартнейших вещей. Показываю.
Здравствуйте, sincosltd, Вы писали:
S>>>Такой вопрос — S>>>может ли функция класса быть каллбаком?
Только статической? Обычные мемберы имеют скрытый параметр this
А если у тебя apiшная ф-я, то у нее лишнихпараметров быть не должно. S>проблема в том что мне нужно передать в ДиректХ функцию — каллбак : S>hRet = dd7->EnumDisplayModes(DDEDM_REFRESHRATES,NULL,(void*) hwnd,EnumDisplayModes);
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Аноним, Вы писали:
А>По-моему применительно к CreateThread этот хак не стоит применять. У ThreadProc и так есть параметр LPVOID lpParameter. С другой стороны, для любых других применений требуется настройка, так как первый параметр функции (который заменяется на pThis) нужно где-то сохранять
Этот хак основывается на том, что this передается в ecx.