Отладка приложений

Работа с MFC


Если планируется применять LIMODS с приложением, которое использует либо MFC42D.DLL, либо MFC42UD.DLL, нужен дополнительный шаг для ее установки. К сожалению, существует по крайней мере 1001 версия этих двух очень важных DLL. LIMODS должна знать, какое порядковое значение соответствует экспортируемой функции AfxTrace из каждого DLL-файла MFC. Хотя можно предположить, что AfxTrace будет всегда иметь одинаковое порядковое значение, независимо от того, в какой DLL она находится, на самом деле это не так. Дистрибутивный LIMODS.INI содержит информацию о файлах MFC42(U)D.DLL, которые используются с Visual C++ 5 без Service Pack, Visual C++ 6 без Service Pack, Visual C++ 6 с Service Pack 1 (SP1), Visual C++ 6 с Service Pack 2 (SP2) и Visual C++ 6 Service Pack 3 (SP3).

Если установленная версия Visual C++ отличается от перечисленных в LIMODS.INI (включая любые последующие выпуски Service Pack), то придется проделать некоторую дополнительную работу, чтобы гарантировать получение утилитой LIMODS правильного экспорта из MFC42D.DLL и MFC42UD.DLL. Информацию о версии библиотечного файла %SYSTEMROOT%\System32\MFC42(U)D.DLL можно получить, если щелкнуть правой кнопкой мыши на этом файле в Проводнике Windows и выбрать пункт Свойства в раскрывшемся контекстном меню. Затем следует перейти на вкладку Версия диалоговой панели Свойства. Первый пункт этой вкладки (Версия файла) и является искомым номером версии. Например, версия файла MFC42D.DLL, которую использует Visual C++ 6.0 SP3, имеет номер 6.00.8447.0.

Затем нужно перейти в подкаталог \MFC\SRC\Intel каталога Visual C++. Там можно найти DEF-файлы, которые использовались для компоновки MFC. Имена DEF-файлов соответствуют именам двоичных файлов. Например, MFC42D.DEF является DEF-файлом для MFC42D.DLL. Откройте соответствующий DEF-файл и отыщите текст ?AfxTrace@@YAXPBpzz для MFC42D.DLL. Для MFC42UD.DLL найдите текст ?AfxTrace@@YAXPBGZZ. Эта важная строка будет похожа на следующую:

?AfxTrace@@YAXPBDZZ @ 1179 NONAME

Число после знака @ — порядковое значение экспортируемой функции AfxTrace.


Запомните это число: его нужно будет ввести в файл LIMODS.INI.

Откройте свою копию LIMODS.INI. Для MFC42D.DLL ищите секцию [MFC42D.DLL Hack-0-Rama], а для  MFC42UD.DLL— секцию [MFC42UD.DLLHack-o-Rama]. Примерный вид секции для MFC42D.DLL показан ниже (секция для MFC42UD.DLL выглядит примерно так же):

[MFC42D.DLL Hack-0-Rama] 

VerCount=3

; VC 6.0 SP3 

VerO=6.00.8447.0,1179 ;

VC 6.0 SP1 and SP2.

Verl=6.00.8267.0,1179 ; 

VC 6.0 NO SERVICE PACKS

Ver2=6.00.8168.0,1179

Параметры verN определяют номера версий и их порядковые значения. Первое число — номер версии MFC-файла, а второе — порядковое значение функции AfxTrace. Добавьте1 версию вашего MFC-файла и порядковое значение функции AfxTrace В конец секции [MFC42D.DLL Hack-0-Rama] ИЛИ [MFC42UD.DLL Hack-0-Rama]. Например, если вы работаете с Visual C++ 5 без Service Pack, то добавьте строку ver3=4.21.7022,1253 к предшествующему примеру (для MFC42D.DLL). Нужно также увеличить на 1 значение счетчика vercount (vercount=4). Для MFC42UD.DLL в Visual C++ 5 без Service Pack строка была бы такой:

Ver3=4.21.7022,1256.

Если вы модифицируете исходный код MFC и строите собственную MFC42(U)D.DLL, то можно проверять информацию порядкового значения точно так же, как описано выше. Лучше, однако, не изменять исходный код MFC и создавать собственную версию MFC (если, конечно, вы не испытываете желания вручную обновлять каждое исправление MFC-ошибки в своих версиях исходных файлов).

 Эту операцию нужно выполнять только в том случае, когда в списке версий нет параметра ParN для вашей версии системы программирования. — Пер.

LIMODS проверяет версию MFC-файла, когда MFC42(U)D.DLL загружается в память. Если в LIMODS.INI нет соответствующей версии файла, то будет выведено (в окне Output) сообщение об ошибке, сопровождаемое несколькими звуковыми сигналами. Если компилировать и выполнить программу тестирования LIMODS (\SourceCode\LIMODS\TestLIMODS), поставляемую на сопровождающем компакт-диске, то можно быстро выяснить, правильно ли сконфигурирована утилита LIMODS.



Содержание раздела