Имеется функция
void __stdcall TimerCallbackProto(DWORD hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
код
}
Как получить ее адрес в переменную ULONG src?
При простом присваивании src=TimerCallbackProto, src получает неверный адрес.
Еще вопрос можно ли это сделать без *_cast'ов и введения процедурного типа?
27.10.04 22:43: Перенесено модератором из 'C/C++' — Павел Кузнецов
Здравствуйте, _dg, Вы писали:
_dg>При простом присваивании src=TimerCallbackProto, src получает неверный адрес.
Вряд ли можно вообще сделать то, что тебе надо. Скорее всего, после вот такого присваивания в src лежит адрес инструкции jmp [TimerCallbackProto] в таблице. Теоретически, можно взять 6 байт (код команды jmp) с этого адреса и вытащить оттуда реальный адрес. Но далеко не факт, что это именно так (там может быть указатель на какой-нить код, используемый дебугером и т.д.)
А вообще, зачем так делать? Ведь вызов-то по полученному в src "неправильному" адресу все равно доберется до TimerCallbackProto...
Или ты пишешь динамически тело этой функции? Если да, то я в принципе такую проблему обходил, могу сказать как...
Здравствуйте, Antikrot, Вы писали: _dg>>При простом присваивании src=TimerCallbackProto, src получает неверный адрес. A>Вряд ли можно вообще сделать то, что тебе надо. Скорее всего, после вот такого присваивания в src лежит адрес инструкции jmp [TimerCallbackProto] в таблице. Теоретически, можно взять 6 байт (код команды jmp) с этого адреса и вытащить оттуда реальный адрес. Но далеко не факт, что это именно так (там может быть указатель на какой-нить код, используемый дебугером и т.д.)
Мдаа... как там все запутано... Может лучше плюнуть на все и сделать через процедурный тип?
A>А вообще, зачем так делать? Ведь вызов-то по полученному в src "неправильному" адресу все равно доберется до TimerCallbackProto... A>Или ты пишешь динамически тело этой функции? Если да, то я в принципе такую проблему обходил, могу сказать как.
Совершенно верно, мне в рантайме надо подправить в ней два адреса. Все уже работает, за исключением получения адреса самой процедуры, так что очень инетересно узнать как это можно обойти
Чтобы быть более конкретным уточню что я занимаюсь такой довольно банальной вещью, как создание таймера для конкретного экземпляра класса (т.е. подгоняю callback таймера под функцию-член класса)
Здравствуйте, _dg, Вы писали:
_dg>Чтобы быть более конкретным уточню что я занимаюсь такой довольно банальной вещью, как создание таймера для конкретного экземпляра класса (т.е. подгоняю callback таймера под функцию-член класса)
А зачем это делать, извиняюсь через одно место? Не проще ли хранить где ни будь (хоть в std::map) привязку id таймера к конкретному экземпляру?