Кто-нибудь реверсировал программы, работающие с MFC? Там вместо WinMain четыре PUSH'а и переход на подпрограмму из MFC. Собственно хотелось во-первых узнать, как получить настоящий WinMain (или мож там еще несколько есть, не специалист). Пока я просто отладчиком прохожу несколько команд в библиотеке MFC и как вываливаюсь обратно в свою программу - ОНО . Ну а во-вторых, где можно поподробнее почитать про внутреннюю структуру таких программ - какие там поля есть, где, как взаимодействие с MFC происходит и так далее. В крайнем случае - хотя бы список классов и методов MFC. Но хотелось бы побольше.
blueboar А ты писал программы и использованием MFC? Просто такие вопросы задаёшь, кажется, что MFC ты видел только в отладчике уже в виде набора опкодов Можно почитать про саму MFC, про её устройство и основные концепции написано и в MSDN, и в любой другой книге (самая новая Beginning Visual C++ 2005 by Ivon Horton). Так же, при исследовании полезно иметь соответствующии сигнатуры для иды и символы.
Да, видел в отладчике в вид набора опкодов. Вот и хотел узнать основные концепции. То есть в онлайне нету - только покупать?
Можно поискать книжку Румянцева "MFC -- внутренний мир" (вышла ещё в 2003-м, так что, может быть, где-нибудь и выложена в электронном виде).
blueboar "В темную" концепция такая : действительно ты заполняешь поля, а сама MFC крутится где-то в своей среде. Дело имел только два раза : первый раз просто брейк на память делал, а второй раз использовал сигнатуры в ИДА, чтобы увидеть имена функций вместо ordinal.
Итак, следуя совету, поразбирался с MFC изнутри и снаружи. Хотелось бы узнать вот чего (не кидайтесь тухлыми помидорами сразу, я ж только начинающий ). В MFC-программе в секции данных лежит куча VTBL классов. Собсно возникают вопросы - как определить какому классу принадлежит VTBL Далее, в секции данных лежит также куча таблиц сообщений. Вопрос - как их можно быстро искать и как узнать к какому классу они относятся. Как их искать я примерно уже определился - одна из подпрограмм VTBL как раз возвращает указатель на них. Но тогда возникает еще один вопрос - где-то есть стандарт на порядок процедур в VTBL или нет? Как MFC узнает что вот третья процедура это рисование окошка а пятая это выход из программы? Ладно бы они все были однинаковы, так ведь для каждого класса разные и порядок и количество функций. В общем чем подробнее расскажете тем больше буду благодарен )))
Похоже недоразбирался ты еще, раз такие вопросы задаёшь. Виртуальные методы располагаются в порядке их объявления. Корневой класс для всех MFCшных классов - это CObject. Смотрим, какие у него есть виртуальные методы: Код (Text): virtual CRuntimeClass* GetRuntimeClass() const; virtual ~CObject() = 0; virtual void Serialize(CArchive& ar); Таким образом, любая виртуальная таблица MFC-класса начинается с этих трёх методов. В частности, если исследовать, что возвращает GetRuntimeClass(), то можно выйти на структуру CRuntimeClass для данного класса, которая содержит в том числе и его имя. Нужно заметить, что за объявление этого метода и структуры CRuntimeClass в потомках отвечают макрос DECLARE_DYNAMIC. Иногда программисты забывают его добавить и тогда GetRuntimeClass() наследуется от родителя. Поэтому не нужно удивляться если в программе обнаружится несколько классов с вроде бы как одинаковым именем (например CDialog).
Ага, то есть указатель на структуру CRuntimeClass это значение, возвращаемое функцией GetRuntimeClass(). Хорошо. Тогда еще один вопрос - как получить для класса указатель на его карту сообщений? Сами карты я нахожу и интерпретировать умею, а связывать их с конкретными классами пока нет.