Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> присвоить указатель на метод 
:(
    Опции темы
GoldFinch
Дата 9.12.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



есть 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'у указатель на метод?

PM MAIL ICQ   Вверх
mes
Дата 9.12.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(GoldFinch @  9.12.2008,  15:18 Найти цитируемый пост)
и компилятор выдает ошибку что не может преобразовать void(foo::*)() к in

и правильно делает.. Вот я  в который раз удивляюсь, почему Вы выбрали C++, когда не используйте его инструментов, и который в ответ лишний раз Вам ограничивает свободу.

преобразовать можно так :
Код

    union
    {
        void (foo::*f)() 
        size_t  i;
    } u;

    u.f = &foo_bar_hook;
  
   size_t i = u.i;

но всю ответственность за дальнейшее использование и обратное преобразование компилятор перекладывает на Вас.


Это сообщение отредактировал(а) mes - 9.12.2008, 15:46


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.12.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



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++ я использую по вынужденным причинам, так юзал бы фасм и радовался жизни, вместо этого приходится бороться с конпелятором =\
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 9.12.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Можно юнион обернуть в класс.
PM MAIL   Вверх
mes
Дата 9.12.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(GoldFinch @  9.12.2008,  15:51 Найти цитируемый пост)
а в одну строчку это както уместить можно? 

если обернуть в шаблон , вот код вместе с тестовым использованием 
Код


#include <iostream>
class A
{
    public:
        void f () { std::cout << "test " << std::endl; };
};


template <class R, class F> R my_cast (F f)
{
  union
  {
        F f;
        R r;
  }   u;

  u.f =f;

  return  u.r;
};

int main()
{

 size_t i = my_cast<size_t> (&A::f); // сохранили

 void (A::*f)() = my_cast<void (A::*)()> (i); // востанавили

 A a; (a.*f)();   // пороверили

  system("pause");
  return 0;
}




--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.12.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



нда.... всеже 
#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)
...

малость покороче и понятнее будет
PM MAIL ICQ   Вверх
UnrealMan
Дата 9.12.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(mes @  9.12.2008,  15:45 Найти цитируемый пост)
Вот я  в который раз удивляюсь, почему Вы выбрали C++, когда не используйте его инструментов, и который в ответ лишний раз Вам ограничивает свободу.

преобразовать можно так :

Вот я в который раз удивляюсь, насколько хреновые предложения тут порой бывают smile Оставив в сторонке обсуждение самой идеи преобразовывать таким способом, я скажу лишь, что в этом коде

Цитата(mes @ 9.12.2008,  16:11)
Код
#include <iostream>
class A
{
    public:
        void f () { std::cout << "test " << std::endl; };
};


template <class R, class F> R my_cast (F f)
{
  union
  {
        F f;
        R r;
  }   u;

  u.f =f;

  return  u.r;
};

int main()
{

 size_t i = my_cast<size_t> (&A::f); // сохранили

 void (A::*f)() = my_cast<void (A::*)()> (i); // востанавили

 A a; (a.*f)();   // пороверили

  system("pause");
  return 0;
}

ты допустил довольно грубую ошибку, которая с большой вероятностью может убить программу даже если значение указателя достаточно мало, чтобы влезть в size_t.

Это сообщение отредактировал(а) UnrealMan - 9.12.2008, 17:56
PM MAIL   Вверх
mes
Дата 9.12.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(UnrealMan @  9.12.2008,  17:50 Найти цитируемый пост)
ты допустил довольно грубую ошибку,

какую ?  с учетом того, что
my_cast - преобразователь по битовому представлению без контроля компилятора на тип и размер, т.е. под ответственность программиста. 

Цитата(mes @  9.12.2008,  15:45 Найти цитируемый пост)
но всю ответственность за дальнейшее использование и обратное преобразование компилятор перекладывает на Вас.



Это сообщение отредактировал(а) mes - 9.12.2008, 19:39


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 9.12.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



mes, при разной длине типов при преобразовании из короткого в длинное будет мусор в оставшихся битах

Это сообщение отредактировал(а) J0ker - 9.12.2008, 20:06


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 9.12.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(J0ker @  9.12.2008,  20:06 Найти цитируемый пост)
mes, при разной длине типов при преобразовании из короткого в длинное будет мусор в оставшихся битах

но при обратном в то же самое из чего было преобразовано этот мусор не зацепится.. можно конечно и обнулять юнион перед началом преобразований. 

Это сообщение отредактировал(а) mes - 9.12.2008, 20:36


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 9.12.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(mes @  9.12.2008,  20:35 Найти цитируемый пост)
но при обратном в то же самое из чего было преобразовано этот мусор не зацепится..

пардон, тогда зачем эта хрень вообще нужна?  smile 
обнулять нужно обязательно

Это сообщение отредактировал(а) J0ker - 9.12.2008, 20:53


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 9.12.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



добавил обнуление и  проверку по размеру, чтоб длина результативной переменной была не меньше  (можно поставить == ) исходной.
Код

#define STATIC_CHECK( expr ) { char unnamed[ (expr) ? 1 : 0 ]; }

template <class R, class F> R my_cast (F f)
{
  STATIC_CHECK ( sizeof(R)>=sizeof(F) );

  union
  {
        F f;
        R r;
  }   u;

  memset (&u, 0, sizeof (u));

  u.f =f;

  return  u.r;
};





--------------------
PM MAIL WWW   Вверх
J0ker
Дата 9.12.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



memset тоже можно запихать в какой-нить дефайн который включается только если конечный тип больше исходного


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 9.12.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(mes @  9.12.2008,  19:33 Найти цитируемый пост)
my_cast - преобразователь по битовому представлению без контроля компилятора на тип и размер, т.е. под ответственность программиста. 

Т.е. твою ответственность - ты же этот способ предложил smile 

Цитата(mes @  9.12.2008,  20:58 Найти цитируемый пост)
проверку по размеру, чтоб длина результативной переменной была не меньше  (можно поставить == ) исходной

Это для того, чтобы получился этакий облагороженный грязный хак, не работающий на большинстве машин? smile 
PM MAIL   Вверх
mes
Дата 9.12.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(UnrealMan @  9.12.2008,  21:37 Найти цитируемый пост)
Это для того, чтобы получился этакий облагороженный грязный хак, не работающий на большинстве машин? smile  

насчет большинства машин, у автора оговорка была (правда не в этой теме), что его устраивает зависимое решение, для его задачи.
Придумать другого вида преобразования которое требуется автору я пока не могу, если есть варианты тоже был бы рад услышать.

Цитата(UnrealMan @  9.12.2008,  21:37 Найти цитируемый пост)
Т.е. твою ответственность - ты же этот способ предложил smile 

согласен.. и стараюсь исправить недоделки, которые незаметил . 

Это сообщение отредактировал(а) mes - 9.12.2008, 21:47


--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 9.12.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(mes @  9.12.2008,  21:47 Найти цитируемый пост)
насчет большинства машин, у автора оговорка была (правда не в этой теме), что его устраивает зависимое решение, для его задачи.

Неужели автор - редкий счастливиц, обладающий платформой с размером указателя на нестатическую функцию, равным sizeof(int)? Интересно было бы узнать, однако smile

Добавлено через 49 секунд
reinterpret_cast-ы между целыми и указателями на члены всё-таки неспроста не хотят компилироваться.
PM MAIL   Вверх
GoldFinch
Дата 9.12.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



если что я решил эту проблему как 
#define HOOK_PTR(rva,hook) __asm mov dword ptr [eax+rva],offset hook
PM MAIL ICQ   Вверх
mes
Дата 9.12.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(UnrealMan @  9.12.2008,  21:54 Найти цитируемый пост)
обладающий платформой с размером указателя на нестатическую функцию, равным sizeof(int)? 

думаю что нет.. у меня например размер  (оказывается) равен 8 байтам.  )

Цитата(UnrealMan @  9.12.2008,  21:54 Найти цитируемый пост)
reinterpret_cast-ы между целыми и указателями на члены всё-таки неспроста не хотят компилироваться. 

поэтому и хак

Добавлено через 2 минуты и 27 секунд
Цитата(GoldFinch @  9.12.2008,  22:11 Найти цитируемый пост)
если что я решил эту проблему как 
#define HOOK_PTR(rva,hook) __asm mov dword ptr [eax+rva],offset hook 

тоже хак ))
кстати обратите внимание, на подсказку UnrealMan о длине указазателя на метод.




--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.12.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



mes, так-то оно так, да только offset xxx::yyy всегда 4 байта, ибо это реальный указатель на код
PM MAIL ICQ   Вверх
J0ker
Дата 9.12.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(UnrealMan @  9.12.2008,  21:54 Найти цитируемый пост)
Неужели автор - редкий счастливиц, обладающий платформой с размером указателя на нестатическую функцию, равным sizeof(int)?

ээээ
я что-то пропустил?
Код

struct B
{
};

typedef void(B::*tptr)();

int _tmain(int argc, _TCHAR* argv[])
{
    cout << sizeof(int) << endl;
    cout << sizeof(tptr) << endl;

    return 0;
}


4
4




--------------------
user posted image
PM MAIL   Вверх
mes
Дата 9.12.2008, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(J0ker @  9.12.2008,  23:32 Найти цитируемый пост)
   cout << sizeof(int) << endl;
    cout << sizeof(tptr) << endl;

Цитата(J0ker @  9.12.2008,  23:32 Найти цитируемый пост)
я что-то пропустил?


странно.. у меня :
4
8




Это сообщение отредактировал(а) mes - 9.12.2008, 23:57


--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 10.12.2008, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(J0ker @  9.12.2008,  23:32 Найти цитируемый пост)
ээээ
я что-то пропустил?

В VC++ проверял? Там всякое может быть, да smile Размер указателя на член почему-то варьируется от 4 до 16. У меня даже получалось для одного и того же объекта разные значения sizeof получать smile

Код
// A.cpp

#include <iostream>

struct B {};
struct D : virtual B
{
    void f () {};
};

void (D::*fptr)() = &D::f;

int main()
{
    std::cout << sizeof(fptr) << std::endl; // 12
    void show_size_of_fptr();
    show_size_of_fptr();
}

Код
// B.cpp

#include <iostream>

struct D;
extern void (D::*fptr)();

void show_size_of_fptr()
{
    std::cout << sizeof(fptr) << std::endl; // 16
}

PM MAIL   Вверх
J0ker
Дата 10.12.2008, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(UnrealMan @  10.12.2008,  01:59 Найти цитируемый пост)
В VC++ проверял? Там всякое может быть, да smile Размер указателя на член почему-то варьируется от 4 до 16. У меня даже получалось для одного и того же объекта разные значения sizeof получать smile


Цитата(UnrealMan @  10.12.2008,  01:59 Найти цитируемый пост)
std::cout << sizeof(fptr) << std::endl; // 12


Цитата(UnrealMan @  10.12.2008,  01:59 Найти цитируемый пост)
std::cout << sizeof(fptr) << std::endl; // 16

ыыыыыыы  smile 
аааа
ааа почему?????? smile 
ниче не понимаю.... как-то никогда не задавался таким вопросом - всегда считал любой адрес совместимым с void*

Добавлено через 38 секунд
Цитата(UnrealMan @  10.12.2008,  01:59 Найти цитируемый пост)
В VC++ проверял?

да


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 10.12.2008, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



вы будете смеяться, но под дебагером watch показывает 4 и там и там, а сами значения адреса ессесна 4-х байтовые, а распечатывается все равно 12 и 16...


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 10.12.2008, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



вот в этой статье  наткнулся на небольшое объяснение : http://www.rsdn.ru/article/cpp/fastdelegate.xml


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 10.12.2008, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



о
все понял
дело во множественном наследовании
спасибо за интересную тему  smile

Добавлено через 1 минуту и 8 секунд
Цитата(mes @  10.12.2008,  04:59 Найти цитируемый пост)
вот в этой статье  наткнулся на небольшое объяснение : http://www.rsdn.ru/article/cpp/fastdelegate.xml 

здесь получше наверное
http://blogs.msdn.com/oldnewthing/archive/...2/09/70002.aspx


--------------------
user posted image
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1505 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.