![]() |
Модераторы: 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, опишите вашу проблему подробнее
|
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
vtlb не специфицирована. все компиляторы реализуют её как хотят. юзать её тоже крайне не желательно. -------------------- ![]() |
|||
|
||||
Abyx |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
но это только если
для этого надо запрещать множественное наследование Это сообщение отредактировал(а) Abyx - 4.8.2010, 19:12 |
||||
|
|||||
MrLukS |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Есть класс SomeClass. Описание класса выше.
Необходимо перехватить с помощью MS Detours 2.1 функцию entryClass->SomeFunc(), функция-перехватчик:
Заголовки SomeClass в первом посте. // Edit: в оригинальном SomeClass ЕСТЬ наследование. Я не имею права изменять этот класс. Это сообщение отредактировал(а) MrLukS - 4.8.2010, 19:15 |
||||
|
|||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
||||
|
||||
MrLukS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Каким образом узнать размер указателя? Это сообщение отредактировал(а) MrLukS - 4.8.2010, 19:27 |
|||
|
||||
Modul |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
А почему бы не передать указатель на объект и вызвать нужный метод.
Что для С было нужно и просто, для С++ напоминает жуть ! --------------------
I'll be back ! |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
||||
|
||||
MrLukS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
И так, вот полный код:
К сожалению, код не выполняет своей главной функции, к тому же крашиться при попытке вызова оригинальной функции. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Всё что можно в Си, можно и в С++... -------------------- вопросов больше чем ответов |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
||||
|
||||
MrLukS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Abyx, =\ Я показал где ошибка: я не могу сохранить указатель на функцию. 73 строка, выдает неправильный указатель.
|
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
MrLukS, вам еще рано этим заниматься. сначала изучите матчасть.
|
|||
|
||||
MrLukS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Abyx, я знаю матчасть. Я не знаю лишь STL, который я никогда не использовал. И надеюсь никогда не буду использовать. Привык, видите-ли, не использовать всякие примочки и кодить на чистом языке...
Спасибо за помощь, дальше буду разбираться как-нибудь сам. Наверное перепишу проект на асме.. Там хотя-бы не будет таких мук с классами. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Сильно сомневаюсь. Вот bsa, пожалуй, может так сказать...
![]() Довольно неразумный подход, отказываться от библиотек. Чисто так, для сведения. VTBL не имеет никакого отношения к стандарту С++. Реализация вольна осуществлять "виртуальный" вызов функции на своё усмотрение. Это сообщение отредактировал(а) Леопольд - 4.8.2010, 22:40 -------------------- вопросов больше чем ответов |
|||
|
||||
MrLukS |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
![]()
Знаю, однако только так я смогу контролировать все, что накодил. Не люблю, как я уже сказал, пользоваться готовым закрытым кодом, да еще и работающим неизвестно как. Темболее это же мелкомягкие... ![]() Проблему решил, vtable творят чудеса ![]() ![]() |
||||
|
|||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
STL полностью открыта STL специфицируется стандартом C++ и должна работать одинаково во всех реализациях (включая время выполнения операций). А реализация от M$ не худшая. -------------------- ![]() |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Вполне возможно...
Как минимум, добровольный отказ от STL наталкивает на эту мысль. Добавлено @ 00:39
Это сообщение отредактировал(а) Леопольд - 5.8.2010, 00:39 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Имхо, к проблеме Вы подошли не с той стороны.. Вопрос нужно было задавать не о том, как запомнить адрес виртуальной функции, а о том как можно решить ту задачу, для который Вы решили запоминать функции... что именно Вам нужно непонятно, но посмотрите это : http://codepad.org/edtM5QhB |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Когда у меня был опыт работы на С++ 5-7-ми лет, я с удивлением открыл для себя, что я не знаю языка - тоже не знал STL. Более того, сейчас я знаю и STL, и boost умею пользоваться, но опять же, не могу утверждать, что я отлично знаю С++. То что ты пытаешься использовать vtable это вообще называется "грязный хак". И применять его в не академических целях мягко говоря глупо. Я, честно говоря, так и не понял, зачем нужен этот MS Detours. Но есть подозрение, что это тоже сродни "грязному хаку". Кстати, если тебе нужно ловить начало выполнения определенных методов, то можешь в них воткнуть вызов какой-то пустой внешней функции, адрес которой и передашь этому detours. |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
собственно вам следовало с этого и начинать, и не писать "грязный хак" и т.п. если бы вы знали зачем нужен Detours, в каких случаях он применим, вы бы не писали про хаки. перехват функций подразумевает знание особенностей кода который перехватывается, так что это совсем не хак. если надо перехватывать код в чужой 32разрядной программе скомпилированной VC++, то очевидно что там не будет проблем с тем что у уже скомпилированной программы внезапно поменяется разрядность и компилятор. |
|||
|
||||
icecrashldr |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
Может быть стоит использовать dbgeng?
Апи предоставляется из пакета Debugging Tool for Windows, и это "отладчик-апи" хорошо совместно с Visual studio. Поставить бряки и дело то с концом ... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
mes,
1. ТС написал что он перехватывает функцию и использует Detours. Это вполне достаточно чтобы понять задание. 2. что есть хак? поведение компилятора полностью определено документацией компилятора. как устроена vftable у MSVC написано в документации MSVC и множестве статей, в том числе и от MS. где тут хак? 3. писать о том в чем не разбираешься - это не есть хорошо. особенно писать "я не знаю что это такое но это плохо" |
|||
|
||||
Modul |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
Вот и я о том же говорил. Нужно правильно задачу поставить, а не писать - мне нужно...вызвать закорючку. Т.е. человеку кажется, что он прав. А как можно даже с заказчиком вести разговор, если он не может ее сформулировать ! ![]() --------------------
I'll be back ! |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а где сказано что компилятoр MSVC(кроме косвенных упоминаний таких как thiscall), и что остальные рассматривать не надо ?.. грубо: то что делается в обход предусмотренного способа использования. ![]() |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
разговор скатился в никуда. ТС вроде как решил свою задачу, а вы обсуждаете хз что %)
|
|||
|
||||
asd |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: нет Всего: 1 |
MrLukS,
Если вам нужно перехватить какую-то ф-ию в классе, то может сделать так? class SomeClass2: public SomeClass { public: virtual void SomeFunc(int SomeParam) { ... SomeClass::SomeFunc(int SomeParam); ... } }; и юзать SomeClass2 вместо SomeClass |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
||||
|
||||
asd |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 25.6.2006 Репутация: нет Всего: 1 |
Прочитал ещё раз. Так про что речь? Про то что надо во что бы то ни стало получить указатель на метод, чтобы передать его в дллку для логирования? Ну, да, тогда мой пост вообще мимо кассы. Но, имхо, логировать действия своего кода с помощью сторонней либки, как-то странно.
|
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
"логирование" - теперь это так называется ))
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В С++ НЕТ стандартного способа получить абсолютный адрес виртуального (да и не виртуального тоже) метода класса.
Это возможно только либо через расширения языка (как в gcc например), либо через точное знание внутреннего устройства транслируемого С++ кода (для любого компилятора). И в любом случае это на 100% не переносимо. |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
xvr, для задачи ТСа переносимость не нужна, это какбэ очевидно
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |