Перехват адреса AfxMessageBox
От: zmxncbv  
Дата: 02.12.08 10:06
Оценка:
Здравствуйте!
Стоит задача подменить в MFC-проекте адрес функции AfxMessageBox на адрес самодельной функции. Проблема в том, что как показало исследование, AfxMessageBox не экспортируется из dll-файла по имени, а использует для этой цели числовой идентификатор ("1123" для mfc71.dll и "1493" для mfc71d.dll). Вопрос: не знает ли кто-нибудь способа, помогаюшего получить адрес указанной функции из DLL по имени функции? Представляется неверным привязывать код к числовым идентификаторам, которые более чем вероятно имеют другие значения в новых версиях MFC-библиотек.

02.12.08 17:28: Перенесено модератором из 'C/C++' — Кодт
afxmessagebox
Re: Перехват адреса AfxMessageBox
От: Draqon  
Дата: 02.12.08 10:15
Оценка:
Здравствуйте, zmxncbv, Вы писали:

Z> Вопрос: не знает ли кто-нибудь способа, помогаюшего получить адрес указанной функции из DLL по имени функции? Представляется неверным привязывать код к числовым идентификаторам, которые более чем вероятно имеют другие значения в новых версиях MFC-библиотек.


Если функция экспортируется по ординалу, то нет и не может быть способа её получить по имени. Этой информации просто нет в dll.
Re[2]: Перехват адреса AfxMessageBox
От: zmxncbv  
Дата: 02.12.08 10:48
Оценка:
Здравствуйте, Draqon, Вы писали:

D>Если функция экспортируется по ординалу, то нет и не может быть способа её получить по имени. Этой информации просто нет в dll.


Понятно, что нет. Просто интересно, можно ли это сделать каким-то обходным путём (получить откуда-нибудь таблицу соответствия имен функций и числовых идентификаторов в DLL — глупости, наверное, говорю).
Re: Перехват адреса AfxMessageBox
От: Carc Россия http://www.amlpages.com/home.php
Дата: 02.12.08 15:05
Оценка:
"zmxncbv" <78708@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:3196718@news.rsdn.ru...
> Здравствуйте!
> Стоит задача подменить в MFC-проекте адрес функции AfxMessageBox на адрес самодельной функции. Проблема в том, что как показало исследование, AfxMessageBox не экспортируется из dll-файла по имени, а использует для этой цели числовой идентификатор ("1123" для mfc71.dll и "1493" для mfc71d.dll). Вопрос: не знает ли кто-нибудь способа, помогаюшего получить адрес указанной функции из DLL по имени функции? Представляется неверным привязывать код к числовым идентификаторам, которые более чем вероятно имеют другие значения в новых версиях MFC-библиотек.
>
>
Имхо AfxMessageBox вызовет virtual int CWinAPP::DoMessageBox — может быть проще ее ловить!?!
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re: Перехват адреса AfxMessageBox
От: Kh_Oleg  
Дата: 02.12.08 15:08
Оценка:
Здравствуйте, zmxncbv, Вы писали:

Z>Здравствуйте!

Z>Стоит задача подменить в MFC-проекте адрес функции AfxMessageBox на адрес самодельной функции. Проблема в том, что как показало исследование, AfxMessageBox не экспортируется из dll-файла по имени, а использует для этой цели числовой идентификатор ("1123" для mfc71.dll и "1493" для mfc71d.dll). Вопрос: не знает ли кто-нибудь способа, помогаюшего получить адрес указанной функции из DLL по имени функции? Представляется неверным привязывать код к числовым идентификаторам, которые более чем вероятно имеют другие значения в новых версиях MFC-библиотек.

Depends говорит, что MFC имен функций не экспортирует вообще. Это значит, что конкретный DLL файл при компиляции приложения нельзя использовать без соответствующих именно ему .lib и .h файлов. А проблема новых версий решается просто: в System32 лежат все версии DLL библиотек MFC, которые к тому же имеют разные имена!

Одно непонятно — зачем так сделано?
Re[2]: Перехват адреса AfxMessageBox
От: Nikolaz Германия www.nikeware.com
Дата: 02.12.08 20:29
Оценка:
Здравствуйте, Carc, Вы писали:

C>Имхо AfxMessageBox вызовет virtual int CWinAPP::DoMessageBox — может быть проще ее ловить!?!

Именно! Если свое App, то так и поступают. Стандартно, без всяких "садо-мазо" ...
Re[3]: Перехват адреса AfxMessageBox
От: Carc Россия http://www.amlpages.com/home.php
Дата: 02.12.08 21:09
Оценка:
Здравствуйте, Nikolaz, Вы писали:

N>Здравствуйте, Carc, Вы писали:


C>>Имхо AfxMessageBox вызовет virtual int CWinAPP::DoMessageBox — может быть проще ее ловить!?!

N>Именно! Если свое App, то так и поступают. Стандартно, без всяких "садо-мазо" ...
"Если своё..." ну дык я намекаю...
Aml Pages Home
Re[4]: Перехват адреса AfxMessageBox
От: zmxncbv  
Дата: 03.12.08 03:05
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, Nikolaz, Вы писали:


N>>Здравствуйте, Carc, Вы писали:


C>>>Имхо AfxMessageBox вызовет virtual int CWinAPP::DoMessageBox — может быть проще ее ловить!?!

N>>Именно! Если свое App, то так и поступают. Стандартно, без всяких "садо-мазо" ...

Спасибо за идею. App не своё, но возникла мысль создать класс на основе CWinApp, переопределить для него DoMessageBox и установить объект этого класса как текущее приложение (чтобы AfxGetApp в AfxMessageBox вернула то, что надо).
Re[5]: Перехват адреса AfxMessageBox
От: Carc Россия http://www.amlpages.com/home.php
Дата: 03.12.08 04:14
Оценка:
Здравствуйте, zmxncbv, Вы писали:

Z>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, Nikolaz, Вы писали:


N>>>Здравствуйте, Carc, Вы писали:


C>>>>Имхо AfxMessageBox вызовет virtual int CWinAPP::DoMessageBox — может быть проще ее ловить!?!

N>>>Именно! Если свое App, то так и поступают. Стандартно, без всяких "садо-мазо" ...

Z>Спасибо за идею. App не своё, но возникла мысль создать класс на основе CWinApp, переопределить для него DoMessageBox и установить объект этого класса как текущее приложение (чтобы AfxGetApp в AfxMessageBox вернула то, что надо).

1) Ну такие вещи чреваты... Старый замещаемый код может рассчитывать на определенный обьект CWinApp.
2) Даже если все хорошо, все равно не всегда может пройти. Иногда, догадываясь что "не я один такой вумный" (С) DoMessageBox может вызываться напрямую через статическое связывание с вполне конкретным theApp, доступным в design time, а не через получение указателя через AfxGetApp(). Хотя пожалуй такое редко встретишь...
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.