![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
MrLukS |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Есть класс:
Необходимо получить указатель на SomeFunc и сохранить его в переменную. Поиск по Vtable не предлагать - в оригинальном классе огромное количество функций и он все время меняется.
Это сообщение отредактировал(а) MrLukS - 4.8.2010, 17:35 |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Указатель на не статический метод класса имеет размер в два раза больший, чем обычный указатель. Поэтому в DWORD он не поместится. И вообще, не делай этого. Это плохой тон программирования, ты себя жестко привязываешь к разрядности текущего процессора. Т.е. даже если ты это и сделаешь, то под 64-х битной виндой это работать не будет.
Ты лучше скажи, зачем тебе это надо, и мы посоветуем, как лучше это сделать. Это сообщение отредактировал(а) bsa - 4.8.2010, 18:08 |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
угу. Делай типа так
-------------------- ![]() |
|||
|
||||
icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
|
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
Самые распространённые ошибки в 64-битных системах - это попытки записать указатель в 32-битную переменную
http://habrahabr.ru/blogs/cpp/97810/ Добавлено через 53 секунды icecrashldr, вот так одним махом похоронить переносимость? не хорошо это! -------------------- ![]() |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
MrLukS, он не влезет в dword. reinterpret_cast такой каст не выполнит даже если влезет.
надо использовать union. надо отключить множественное наследование, чтобы указатель мог влезть в dword.
подробнее - поиск по форуму |
|||
|
||||
icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
Вот полноценный вызов функции ... |
|||
|
||||
MrLukS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Cheloveck, код должен работать только в 32 битных системах. Кроме того, я сказал что мне нужно сохранить указатель как число, а не как непосредственно функцию.
icecrashldr, спасибо, это именно то что мне нужно... Я так и думал, что тут без задействования ассемблера не обойтись. Указатель нужен для перехвата функции. (MS Detours) Это сообщение отредактировал(а) MrLukS - 4.8.2010, 18:26 |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
MrLukS, вы свою функцию перехватываете чтоли?)
но асм там полюбому не нужен Это сообщение отредактировал(а) Abyx - 4.8.2010, 18:30 |
|||
|
||||
MrLukS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Abyx, я функцию из API перехватываю.
Я промучился часов 5 пытаясь нагуглить что-нибудь, а на асме все и понятно, и работает. |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
Обойтись!
http://codepad.org/ewI1DmX7 Это сообщение отредактировал(а) Cheloveck - 4.8.2010, 18:54 -------------------- ![]() |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
вместо __thiscall удобно использовать __fastcall
|
|||
|
||||
MrLukS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Chelovek, слишком сложный код. Повторяю, мне не нужна переносимость, код должен работать только в 32 битной системе.
Abyx, к сожалению, мне нужен именно _thiscall. Немного порыл в сторону VTable:
Теперь, по сути, vtable это двумерный массив указателей на виртуальные функции. Вот только почему-то там нет адреса &SomeClass::SomeFunc |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
-------------------- ![]() |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
MrLukS, опишите вашу проблему подробнее
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |