Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7

Как вызвать член класса по адресу?

04.12.2015, 18:04. Показов 2417. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем вопрос такой:
допустим есть адрес класса, то получается по определенному смещению вызвать его член?
(кстати, как можно найти эти смещения?)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2015, 18:04
Ответы с готовыми решениями:

Как создать указатель на функцию-член класса и вызвать его?
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса: #include "stdafx.h" #include...

Как вызвать функцию-член правильно для класса Person
Задача простая, ввести фамилию и имя и вывести их. Подскажите, как правильно написать функцию вывода print(). Если один параметр...

Как из обыной функции вызвать функции член класса?
Требуется установить таймер. При компиляции выдаётся ошибка. Как ее решить? void handlук(int signo) { cTimer.run; } ...

10
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
04.12.2015, 18:06
что такое "адрес класса"?
Не бывает такого!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.12.2015, 18:21
Цитата Сообщение от Крюгер Посмотреть сообщение
кстати, как можно найти эти смещения?
Указатели на функции класса и данные класса. Это и есть эти смещения.
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
04.12.2015, 19:06  [ТС]
Kuzia domovenok, допустим. но метод класса лежит по какому то адресу в памяти, стало быть его можно найти, вызвать и получить некоторые данные из функции по этому адресу? так?

Добавлено через 52 секунды
DrOffset, ну а от чего отталкиваясь искать эти смещения? какой то базовый адрес должен быть по идее?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.12.2015, 19:11
Цитата Сообщение от Крюгер Посмотреть сообщение
какой то базовый адрес должен быть по идее?
Базовый адрес - это адрес самого объекта.
"Смещения" получаются просто - это позволяет язык.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
public:
    void foo() { std::cout << "Foo\n"; }
};
 
int main()
{
    void (A::*offset_foo)() = &A::foo;
    
    A a;
    
    (a.*offset_foo)();
}
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
04.12.2015, 19:24  [ТС]
DrOffset, проблема лишь в том, что этот объект находится не в моей программе, а в чужой, и вот мне нужно найти базовый адрес объекта там. сначала было понятно, полез глубже - соответственно стало не понятно. =(

З,Ы, я инжекчусь в процесс, память становится общая. но суть в том что не понятно как найти этот базовый адресс объекта, и найти смещения. чтобы дернуть нужную функцию. (о типах данных что и куда ложить и что получать из функции ясно, я декомпилировал приложение, посмотрел как устроено)
в общем прошу объяснить, если не трудно, какие есть пути решения задачи
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.12.2015, 20:27
Цитата Сообщение от Крюгер Посмотреть сообщение
и найти смещения. чтобы дернуть нужную функцию.
"Смещения" я неспроста написал в кавычках. Объекты не хранят никаких смещений для своих функций. Функции живут отдельно в единственном экземпляре. Так что тебе нужно искать не смещения относительно объекта, а адреса функций (относительно базового адреса dll). Если функция экспортируемая, то ее имя будет записано в таблице экспорта, соответственно вызвать ее несложно. Если нет, то дизассемблер в зубы и вперед.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
04.12.2015, 21:05
Цитата Сообщение от Крюгер Посмотреть сообщение
допустим. но метод класса лежит по какому то адресу в памяти, стало быть его можно найти, вызвать и получить некоторые данные из функции по этому адресу? так?
функции-методы класса лежат там же, где и обычные функции. Не существует никаких "смещений в объекте".
1
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
05.12.2015, 18:17  [ТС]
DrOffset, Kuzia domovenok, спасибо, сейчас стало яснее.
мда.. задача стала еще более не тривиальной.

Добавлено через 4 минуты
постойте, а как же тогда с помощью методов класса мы обращаемся к конкретному объекту (например метод get класса ) не совсем понятно

Добавлено через 51 секунду
Цитата Сообщение от Крюгер Посмотреть сообщение
к конкретному объекту
чтобы например получить данные полей объекта
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.12.2015, 18:22
Все функции-члены неявно получают this.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.12.2015, 19:44
Лучший ответ Сообщение было отмечено Крюгер как решение

Решение

Цитата Сообщение от Крюгер Посмотреть сообщение
конкретному объекту
Если у тебя есть адрес функции и адрес объекта, то это сделать просто:
C++
1
2
3
4
5
6
7
template <size_t addr, typename R, typename ...Args>
R call_member(void * this_, Args... args)
{
    typedef R (__thiscall * member_type)(void * this_, Args...);
    member_type func = (member_type)addr;
    return func(this_, args...);
}
Вызывать, например, так
C++
1
    call_member<0x0040162f, void>(p);
где 0x0040162f - это адрес функции, а p - это указатель на объект.
Аргументы и возвращаемое значение, если они есть, разумеется должны совпадать.
Плюс вряд ли будет работать для сложных типов в аргументах, если ABI компилятора, которым собирали exe и твоего кода не совпадают. Также это работать не будет, если __thiscall реализован по-разному в компиляторе, которым собирали exe и в том, которым ты собираешь свой код. Читай здесь.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2015, 19:44
Помогаю со студенческими работами здесь

Как вызвать процедуру по адресу?
Как можно вызвать процедуру по адресу ? Есть ли еще способы вызова процедур

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Как правильно вызвать метод класса внутри самого класса?
Здравствуйте. Собственно тема прописана в заголовке: как правильно вызвать метод класса внутри самого класса? Насколько я знаю, для...

Как в методе класса вызвать другой метод того же класса?
class mate { public: int AplusB(int A, int B) { return A+B; } int AplusBplusC(int A, int B, int C)

Как из метода производного класса вызвать поле родительского класса
Добрый день! Помогите пожалуйста вызвать поле базового класса из метода производного класса. Код, составленный мною выводит результат...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru