| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > присвоить указатель на метод |
| Автор: GoldFinch 9.12.2008, 15:18 |
| есть int который лежит в модуле "Mod" по rva 123 сначала я хочу присвоить ему указатель на функцию void foo_bar_hook() { ... } пишу HMODULE hMod = GetModuleHandleA("Mod"); *(int*)((int)hMod+123)=(int)&foo_bar_hook; и все работает ОК но вот захотелось мне вместо функции использовать метод class foo {...}; void foo::bar_hook() { ... } пишу *(int*)((int)hMod+123)=(int)&foo::bar_hook; и компилятор выдает ошибку что не может преобразовать void(foo::*)() к int как присвоить этому int'у указатель на метод? |
| Автор: GoldFinch 9.12.2008, 15:51 |
| mes, а в одну строчку это както уместить можно? а то с функцией я юзал дефайн, было очень удобно: #define HOOK_PTR(rva,hook) *(int*)((int)hMod+rva)=(int)&hook; ... HOOK_PTR(111,Func1_hook) HOOK_PTR(222,Func1_hook) HOOK_PTR(333,Func1_hook) ... а C++ я использую по вынужденным причинам, так юзал бы фасм и радовался жизни, вместо этого приходится бороться с конпелятором =\ |
| Автор: Kallikanzarid 9.12.2008, 15:59 |
| Можно юнион обернуть в класс. |
| Автор: mes 9.12.2008, 16:11 | ||
если обернуть в шаблон , вот код вместе с тестовым использованием
|
| Автор: GoldFinch 9.12.2008, 17:19 |
| нда.... всеже #define HOOK_PTR(rva,hook) __asm mov [eax+rva],offset hook ... GetModuleHandleA("Mod"); HOOK_PTR(111,Func1_hook) HOOK_PTR(222,Func1_hook) HOOK_PTR(333,Func1_hook) ... малость покороче и понятнее будет |
| Автор: UnrealMan 9.12.2008, 17:50 | ||||||
Вот я в который раз удивляюсь, насколько хреновые предложения тут порой бывают
ты допустил довольно грубую ошибку, которая с большой вероятностью может убить программу даже если значение указателя достаточно мало, чтобы влезть в size_t. |
| Автор: mes 9.12.2008, 19:33 | ||
какую ? с учетом того, что my_cast - преобразователь по битовому представлению без контроля компилятора на тип и размер, т.е. под ответственность программиста.
|
| Автор: J0ker 9.12.2008, 20:06 |
| mes, при разной длине типов при преобразовании из короткого в длинное будет мусор в оставшихся битах |
| Автор: mes 9.12.2008, 20:35 | ||
но при обратном в то же самое из чего было преобразовано этот мусор не зацепится.. можно конечно и обнулять юнион перед началом преобразований. |
| Автор: J0ker 9.12.2008, 20:53 | ||
пардон, тогда зачем эта хрень вообще нужна? обнулять нужно обязательно |
| Автор: mes 9.12.2008, 20:58 | ||
добавил обнуление и проверку по размеру, чтоб длина результативной переменной была не меньше (можно поставить == ) исходной.
|
| Автор: J0ker 9.12.2008, 21:18 |
| memset тоже можно запихать в какой-нить дефайн который включается только если конечный тип больше исходного |
| Автор: UnrealMan 9.12.2008, 21:37 | ||||
Т.е. твою ответственность - ты же этот способ предложил
Это для того, чтобы получился этакий облагороженный грязный хак, не работающий на большинстве машин? |
| Автор: mes 9.12.2008, 21:47 | ||
насчет большинства машин, у автора оговорка была (правда не в этой теме), что его устраивает зависимое решение, для его задачи. Придумать другого вида преобразования которое требуется автору я пока не могу, если есть варианты тоже был бы рад услышать. согласен.. и стараюсь исправить недоделки, которые незаметил . |
| Автор: UnrealMan 9.12.2008, 21:54 | ||
Неужели автор - редкий счастливиц, обладающий платформой с размером указателя на нестатическую функцию, равным sizeof(int)? Интересно было бы узнать, однако Добавлено через 49 секунд reinterpret_cast-ы между целыми и указателями на члены всё-таки неспроста не хотят компилироваться. |
| Автор: GoldFinch 9.12.2008, 22:11 |
| если что я решил эту проблему как #define HOOK_PTR(rva,hook) __asm mov dword ptr [eax+rva],offset hook |
| Автор: mes 9.12.2008, 22:17 | ||||||
думаю что нет.. у меня например размер (оказывается) равен 8 байтам. )
поэтому и хак Добавлено через 2 минуты и 27 секунд
тоже хак )) кстати обратите внимание, на подсказку UnrealMan о длине указазателя на метод. |
| Автор: GoldFinch 9.12.2008, 22:28 |
| mes, так-то оно так, да только offset xxx::yyy всегда 4 байта, ибо это реальный указатель на код |
| Автор: J0ker 9.12.2008, 23:32 | ||||
ээээ я что-то пропустил?
|
| Автор: mes 9.12.2008, 23:56 |
странно.. у меня : 4 8 |
| Автор: UnrealMan 10.12.2008, 01:59 | ||||
В VC++ проверял? Там всякое может быть, да
|
| Автор: J0ker 10.12.2008, 04:13 | ||
ыыыыыыы аааа ааа почему?????? ниче не понимаю.... как-то никогда не задавался таким вопросом - всегда считал любой адрес совместимым с void* Добавлено через 38 секунд да |
| Автор: J0ker 10.12.2008, 04:50 |
| вы будете смеяться, но под дебагером watch показывает 4 и там и там, а сами значения адреса ессесна 4-х байтовые, а распечатывается все равно 12 и 16... |
| Автор: mes 10.12.2008, 04:59 |
| вот в этой статье наткнулся на небольшое объяснение : http://www.rsdn.ru/article/cpp/fastdelegate.xml |
| Автор: J0ker 10.12.2008, 05:05 | ||
| о все понял дело во множественном наследовании спасибо за интересную тему Добавлено через 1 минуту и 8 секунд
здесь получше наверное http://blogs.msdn.com/oldnewthing/archive/2004/02/09/70002.aspx |