Утилита WinSpector
WinSpector и ее утилиты помогают вам выполнить послесбойную
проверку невосстановимых ошибок прикладной программы Windows - Windows Unrecoverable Application Errors (UAE) и сбоев по общему
нарушению защиты General Protection Faults (GPF). В случае подобных ошибок WinSpector записывает на диск файл регистрации с полезной информацией о причине исключительной ситуации, включая:
- стек вызова;
- имена процедур и функций в стеке вызова (при небольшом содействии с вашей стороны);
- регистры процессора;
- дизассемблированные инструкции;
- информацию Windows.
Использование WinSpector
Перед использованием WinSpector убедитесь, что TOOLHELP.DLL
(из Windows 3.1 или старше) задана в маршруте. Для надежности не
используйте параллельно с WinSpector других инструментальных
средств отладки (кроме Turbo Debugger). TOOLHELP.DLL - это библиотека Windows, которая обеспечивает для утилит доступ к системной информации нижнего уровня. WinSpector использует TOOLHELP.DLL
при возникновении исключительной ситуации для получения системной
информации, которая будет записана в файл регистрации.
Простейший способ использования WinSpector состоит в помещении его в секцию "load=" вашего файла WIN.INI file. До запуска
WinSpector будет минимизирована. Дополнительного взаимодействия с
ним не требуется. Есть и альтернативные способы, например, можно
также включить WinSpector в группу запуска Windows или дважды
щелкнуть "мышью" на пиктограмме WinSpector для запуска ее после
загрузки Windows.
В случае исключительной ситуации (UAE или GPF) WinSpector
создает отчет - текстовый файл WINSPCTR.LOG, а также двоичный
файл WINSPCTR.BIN, который с помощью утилиты DFA можно транслировать в текстовый файл DFA.OUT. В случае особой ситуации WinSpector выводит диалоговое окно с кратким описанием. Чтобы удалить
окно и прочесть файл регистрации, щелкните "мышью" на OK.
Настройка конфигурации WinSpector
WinSpector можно настроить таким образом, чтобы она лучше
соответствовала вашим потребностям. Это позволяет управлять выводом информации в файл WINSPCTRL.LOG.
Параметры WinSpector можно устанавливать в диалоговом окне
Preferences или с помощью ввода команд непосредственно в файл
WINSPCTR.INI.
Параметр Directory в диалоговом окне Preferences позволяет
вам решить, куда записывается файл регистрации. Если вы не задаете каталог, то по умолчанию используется каталог Windows.
Для задания каталога сделайте следующее:
- Откройте диалоговое окно Preferences.
- Введите в поле ввода Directory имя каталога.
- Выберите командную кнопку OK.
либо добавьте запись LogDir=[каталог] в файл WINSPCTR.INI.
Параметр Viewer диалогового окна Preferences позволяет задать, какое программное средство нужно использовать для просмотра
файла регистрации. Если вы не задаете каталог, то по умолчанию
используется Windows Notepad.
Если исключительная ситуация возникает в процессе сеансе с
текущим окном Windows, чтобы увидеть файл регистрации, выберите
View Log (Просмотр файла регистрации) диалогового окна Latest UAE
или диалоговое окно Preferences. Команда View Log запускает выбранную программу просмотра и передает файл WINSPCTR.LOG в качестве аргумента командной строки.
Чтобы просмотреть предыдущий файл регистрации, выберите в
системном меню WinSpector команду View Log file.
Чтобы задать средство просмотра, сделайте следующее:
- Откройте диалоговое окно Preferences.
- Введите средство просмотра в текстовом диалоговом окне Viewer.
- Выберите командную кнопку OK.
либо добавьте LogViewer=[имя_файла_программы_просмотра] к файлу
WINSPCTR.INI.
Параметры Append New Reports и Overwrite Previous Reports в
диалоговом окне Preferences позволяет вам либо добавить отчеты к
предыдущему файлу регистрации, либо затереть предыдущий файл регистрации при генерации нового отчета. По умолчанию задается затирание предыдущего файла.
Если вы выбираете перезапись предыдущего файла регистрации,
то при первом возникновении исключительной ситуации предыдущий
файл регистрации затирается. Последующие исключительные ситуации,
возникающие в процессе текущего сеанса работы с Windows, будут
добавлять информацию к этому файлу.
Чтобы добавлять отчеты к предыдущему файлу регистрации, сделайте следующее:
- Откройте диалоговое окно Preferences.
- Установите Log File в Append New Reports.
- Выберите командную кнопку OK.
либо нужно добавить Add CreateNewLog=0 в файл WINSPCTR.INI.
Чтобы затирать предыдущие файлы регистрации, сделайте следующее:
- Откройте диалоговое окно Preferences.
- Установите Log File в Overwrite Previous Reports.
- Выберите командную кнопку OK.
либо добавьте Add CreateNewLog=1 в файл WINSPCTR.INI.
Параметр System Information в диалоговом окне Preferences
позволят вам добавить в файл регистрации список задач Task List,
список модулей Module List, и информацию о динамически распределяемой области памяти пользователя (USER) и GDI. По умолчанию в
отчет включается системная информация.
Чтобы включить системную информацию в файл регистрации, сделайте следующее:
- Откройте диалоговое окно Preferences
- В Report Information выберите System Info.
- Выберите командную кнопку OK.
либо нужно добавить Add ShowSystemInfo=1 в файл WINSPCTR.INI.
Чтобы системная информация не включалась в файл регистрации,
сделайте следующее:
- Откройте диалоговое окно Preferences
- В Report Information отмените System Info.
- Выберите командную кнопку OK.
либо нужно добавить Add ShowSystemInfo=0 в файл WINSPCTR.INI.
Параметр AUX Summary в диалоговом окне Preferences указывает
WinSpector, что на устройство AUX нужно выводить сокращенную форму отчета. Чтобы использовать данный параметр, нужно подключить к
AUX терминал или драйвер устройства, который перенаправляет AUX
на второй монитор. По умолчанию информация на AUX не выводится.
Для передачи итогового отчета на устройство AUX сделайте
следующее:
- Откройте диалоговое окно Preferences.
- В Report Information, выберите Summary To AUX.
- Выберите командную кнопку OK.
либо добавьте LogToStdAux=1 в файл WINSPCTR.INI.
Чтобы итоговый отчет не передавался на устройство AUX сделайте следующее:
- Откройте диалоговое окно Preferences.
- Under Report Information, отмените Summary To AUX.
- Choose OK.
либо добавьте LogToStdAux=0 в файл WINSPCTR.INI.
Параметр Stack Frame Data в диалоговом окне Preferences позволяет вам выполнить подробную трассировку стека в файл регистрации. Для кадра стека не превышающего 256 байт выполняется шестнадцатиричный дамп, начиная с SS:BP для кадра стека. Если между двумя последовательными кадрами стека больше 256 байт, то показ
памяти для этого кадра опускается. Эти данные можно использовать
для получения значений или параметров, которые передавались функции. По умолчанию подробная трассировка стека не выполняется.
Обычно для выявления значений параметров существенно проще
использовать утилиту DFA. Однако в тех случаях, когда вам недоступна информация отладчика, может оказаться полезной подробная
трассировка стека. Чтобы добавить данные трассировки стека в файл
регистрации, сделайте следующее:
- Откройте диалоговое окно Preferences.
- В Report Information, выберите Stack Frame Data.
- Выберите командную кнопку OK.
либо добавьте ShowStackInfo=1 в файл WINSPCTR.INI.
Чтобы не включать данные кадра стека в файл регистрации,
сделайте следующее:
- Откройте диалоговое окно Preferences.
- В Report Information, отмените Stack Frame Data.
- Выберите командную кнопку OK.
либо добавьте ShowStackInfo=0 в файл WINSPCTR.INI.
Параметр PostMortem Dump в диалоговом окне Preferences генерирует файл WINSPCTR.BIN.
Утилита DFA воспринимает файл WINSPCTR.BIN и информацию Турбо отладчика (файлы .TDS) и транслирует непосредственные двоичные
данные в полезную форму. Она генерирует файл, содержащий трассировку стека аналогичную той, что выводится в файл регистрации, но
с именами функций и номерами строк, а также локальными и глобальными переменными.
Генерация файла WINSPCTR.BIN:
- Откройте диалоговое окно Preferences.
- В Report Information выберите PostMortem Dump.
- Выберите командную кнопку OK.
либо добавьте PostMortemDump=1 в файл WINSPCTR.INI.
Чтобы не генерировать файл WINSPCTR.BIN, сделайте следующее:
- Откройте диалоговое окно Preferences.
- В Report Information, отмените PostMortem Dump
- Выберите командную кнопку OK.
либо добавьте PostMortemDump=0 в файл WINSPCTR.INI.
Параметр User Comments в диалоговом окне Preferences позволяет вам ввести информацию о том, что происходило во время возникновения исключительной ситуации. Диалоговое окно выводится
немедленно после записи файла регистрации, и в это время можно
ввести комментарии о том, что произошло. Ваши комментарии будут
добавляться к файлу регистрации.
Чтобы добавить комментарии пользователя в файл регистрации,
сделайте следующее:
- Откройте диалоговое окно Preferences.
- В Report Information, выберите User Comments.
- Выберите командную кнопку OK.
либо добавьте ShowUserInfo=1 в файл WINSPCTR.INI.
Чтобы не включать комментарии пользователя в файл регистрации, сделайте следующее:
- Откройте диалоговое окно Preferences.
- В Report Information, отмените User Comments.
- Выберите командную кнопку OK.
либо добавьте ShowUserInfo=0 в файл WINSPCTR.INI.
Файл WINSPCTR.LOG
Первая строка в отчете (отчетах) WINSPCTR.LOG показывает вам
дату и время возникновения исключительной ситуации. На второй
строке перечисляется:
- тип исключительной ситуации;
- имя модуля;
- логический адрес;
- физический адрес;
- текущая задача во время особой ситуации.
Если указатель стека во время исключительной ситуации слишком мал, TOOLHELP.DLL автоматически переключает стек. Когда это
происходит, в конце второй строки файла регистрации выводится сообщение "Stack Switched".
Раздел дизассемблирования
Первая строка раздела дизассемблера файла регистрации указывает, что вызвало исключительную ситуацию.
После этого следуют несколько инструкций программы. Эти последующие команды перечисляются для обеспечения ссылок с целью
нахождения вызвавшей особую ситуацию задачи.
Раздел трассировки стека
Первая строка раздела трассировки стека файла регистрации
идентифицирует функцию или процедуру, которая выполнялась во время исключительной ситуации. Stack Trace information включает в
себя:
- номер кадра стека;
- имя модуля;
- имя ближайшей функции перед адресом функции, вызвавшей
особую ситуацию, плюс число, указывающее как далеко вы находились от этой функции (эта информацию указывается только при наличии файла .SYM);
- логический или физический адрес кадра стека;
- куда ваша программа возвращается после вызова.
Когда WinSpector дает имена функций, он ищет в файле .SYM
ближайший идентификатор, который встречается перед адресом стека
вызова. Некоторые файлы .SYM не содержат информации обо всех инструкциях. Таким образом, имя функции в файле регистрации будет
представлять ближайшую функцию в файле .SYM с адресом, предшествующим адресу стека. Если поле смещение показывает слишком большое значение, то имя функции подозрительно.
Раздел регистров
Раздел регистров файла регистрации представляет значения,
которые находились в стандартных регистрах во время исключительной ситуации. Для регистров CS, DS, ES и SS даны ограничения и
полномочия доступа.
Раздел очереди сообщений
Раздел очереди сообщений файла регистрации представляет:
последнее сообщение, фактически полученное в ходе обработки. Кроме того, дается список сообщений, ожидающих в очереди во время
исключительной ситуации. Перечисляется следующая информация:
- описатель (дескриптор) окна (идентифицирует, какое это окно):
- номер идентификатора сообщений (идентифицирует, каким он
был);
- два параметра (присутствующие для любого заданного окна).
То, что записывается в разделе очереди сообщений, может фактически не быть реальным последним сообщением, полученным программой. Windows может обходить очередь сообщений (используя, например, функцию SendMessage). При использовании информации об
очереди сообщений нужно иметь это в виду.
Раздел задач
В разделе задач файла регистрации перечисляются все программы, работающие в системе во время возникновения исключительной
ситуации. Здесь приводится следующая информация:
- полный маршрут выполняемого файла;
- имя модуля;
- описатель окна модуля;
- описатель задачи;
- каким было значение сегмента данных для задачи (описатель
экземпляра).
Раздел модулей
В разделе модулей файла регистрации перечисляются модули,
которые выполнялись во время возникновения исключительной ситуации. Здесь приводится следующая информация:
- маршрут для программы, выполняющей файл;
- дату;
- размер файла;
- имя модуля;
- описатель модуля;
- счетчик ссылок (сколько элементов использует модуль).
Информация о динамически распределяемой памяти USER и GDI
Информация о пользовательской динамически распределяемой области памяти USER и динамической памяти GDI показывается, какой
процесс динамической памяти USER и GDI был доступен во время исключительной ситуации.
Секция системной информации
В разделе системной информации файла регистрации показывается режим и версия Windows, под которой выполняется ваша программа. Показывается также следующее:
- информация процессора:
- наибольший свободный блок памяти;
- общее пространство линейной памяти;
- свободное пространство линейной памяти;
- страницы свопинга файлов.
Обработка данных WinSpector
Утилита DFA обрабатывает информацию Турбо отладчика,
собранную WinSpector во время возникновения исключительной ситуации. Если во время исключительной ситуации информация отчета установлена в PostMortem Dump, то WinSpector записывает файл
WINSPCTR.BIN. После этого для трансляции файла WINSPCTR.BIN в полезный формат можно использовать утилиту DFA.
Информация, выводимая утилитой DFA
Утилита DFA записывает файл только в том случае, если в кадре стека для файла присутствует информация отладчика Turbo Debugger. Выходной файл DFA (DFA.OUT) содержит трассировку стека, аналогичную файлу регистрации WinSpector. Кроме того, там находится следующее:
- имена функции;
- номера строк;
- локальные и глобальные переменные;
- сегменты данных и их значения (включая сегмент стека).
Во время сеанса работы в Windows записывается только один
файл WINSPCTR.BIN, поэтому построцессорная обработка файла выполняется с подсказкой. При этом вы можете удалить или переименовать
файлы DFA.OUT и WINSPCTR.LOG, что позволит отследить за один сеанс более одной исключительной ситуации.
Использование утилиты DFA с WINSPCTR.LOG
При использовании только с файлом WINSPCTR.LOG утилита DFA
дает минимальную информацию трассировки стека, такую как адреса.
Когда в выполняемом файле или в отдельном файле присутствует информация отладчика (файл .TDS), к отчету добавляются имена исходных файлов и номера строк.
Использование утилиты DFA с файлом WINSPCTR.BIN
При использовании файла WINSPCTR.BIN утилита DFA делает доступной следующую дополнительную информацию:
- переменные в стеке, добавленные в файл регистрации, включая структуры и массивы;
- для функции перечисляются типы переменных, значения и адреса.
При наличии файла отладчика .TDS для каждого кадра стека
утилита DFA сообщает:
- Секция 1:
- исходный файл;
- локальные переменные;
- параметры.
- Секция 2:
- имя модуля для задачи, вызвавшей сбой;
- имена файлов;
- логические сегменты;
- их сегменты;
- где находятся их данные и код.
- Секция 3:
- глобальные переменные;
- статические переменные;
- их значения во время исключительной ситуации.
Синтаксис: DFA [параметр] WINSPCTR.LOG [WINSPCTR.BIN]
Необходим файл WINSPCTR.LOG. При его наличии вы получаете
информацию об исходном файле и номерах строк. При наличии файла
WINSPCTR.BIN (который не обязателен) вы получите дополнительную
информацию о переменной.
Параметр | Действие
|
---|
/O[выходной_файл] | Переименовывает выходной файл (по умолчанию DFA.OUT).
|
/D | Вынуждает DFA записывать шестнадцатиричный дамп сохраненных сегментов данных.
|
Другие инструментальные средства WinSpector
EXEMAP, TMAPSYM и BUILDSYM представляют собой три утилиты,
которые улучшают вид информации, которую WinSpector обеспечивает
для исключительной ситуации.
Утилита EXEMAP
Файлы .MAP для выполняемых файлов Windows создает утилита
EXEMAP. Файл .MAP можно использовать для создания файла .SYM, который затем используется WinSpector для улучшения отчета об ошибках. Это может быть особенно полезным для использования с .DLL
или другими программами, для которых у вас нет исходного кода.
Хотя полученный в результате файл .MAP не будет таким пол-
ным, как сгенерированных компоновщиком, он содержит адреса экспортируемых общедоступных функций.
Синтаксис: EXEMAP имя_выполняемого_файла [выходной_файл_map]
Если [выходной_файл_map] и не задается, то по умолчанию это
будет имя_выполняемого_файла.MAP.
Утилита TMAPSYM
Утилита TMAPSYM создает файлы .SYM из существующих файлов
.MAP. (созданных либо TLINK, либо утилитой EXEMAP). Результирующий файл .SYM содержит информацию о доступных для WinSpector
функции public, именах переменных и функциях в таблице входа.
Константы и информация о номерах строк в генерируемый утилитой
TMAPSYM файл .SYM не включается.
Синтаксис: TMAPSYM имя_файла[.MAP]
Расширение .MAP не обязательно.
Прекомпилированные файлы заголовков Borland C++ используют
расширения .SYM и могут быть случайно затерты при генерации файла
идентификаторов .SYM. Если вы используете компилятор, работающий
в режиме командной строки, то можете указать параметр для переименования файла заголовка, чтобы избежать подобного конфликта
имен.
BUILDSYM перезаписывает любой существующий файл .SYM. Для
надежности перед использованием утилиты BUILDSYM или TMAPSYM скопируйте существующие файлы .SYM.
Утилита BUILDSYM
Утилита BUILDSYM предлагает удобный способ для создания файлов .SYM для одного или более выполняемых файлов в каталоге.
Когда файлы .SYM недоступны, создание их без BUILDSYM за два
шага:
- Используйте утилиту EXEMAP для программы, чтобы создать
файл .MAP.
- Используйте утилиту TMAPSYM с файлом .MAP для создания
файла .SYM.
Утилита BUILDSYM использует EXEMAP и TMAPSYM, но полный процесс можно выполнить с помощью только одной команды. BUILDSYM
после создания файлов .SYM стирает также из каталога файлы .MAP.
Утилита BUILDSYM поддерживает синтаксис, позволяющий использовать
трафаретные символы, что дает вам возможность создавать файлы
.SYM для всех файлов каталога или части файлов с помощью одной
команды.
BUILDSYM требует, чтобы утилиты EXEMAP и TMAPSYM указывались
в маршруте доступа. Полученные в результате файлы .SYM помещаются
в текущий каталог. Чтобы WinSpector могла найти файл .SYM, при
возникновении исключительной ситуации он должен находиться в том
же каталоге, что и выполняемый файл.
Утилита BUILDSYM делает следующее:
- проверяет, что файлы действительно представляют собой файлы Windows (если это не так, то данная утилита их не трогает);
- вызывает утилиту EXEMAP для создания файлов .MAP;
- проверяет, что файлы .MAP были созданы;
- вызывает утилиту TMAPSYM, передавая ей имена новых файлов
.MAP для создания файлов .SYM;
- удаляет файлы .MAP (которые больше не требуются).
Синтаксис: BUILDSYM имя_файла
В имени файла допускается указывать трафаретные символы DOS.
Компоновщик TLINK
TLINK и TLINK32 - это инструментальные средства, работающие
в режиме командной строки, которые комбинируя другие модули (файлы .OBJ) и библиотечные модули (.LIB) создают выполняемые файлы.
В IDE имеются встроенные версии этих компоновщиков. Поскольку
компилятор автоматически вызывает компоновщик, явный вызов его не
требуется, пока вы не отмените этап компоновки (параметр -c). Если не указано обратное, все, что говорится о TLINK, применимо и
для TLINK32.
TLINK использует файл конфигурации с именем TLINK.CFG, файл
подсказки и параметры командной строки, задающие компоновку объектных модулей, библиотек и ресурсов в файл .EXE или .DLL. Компоновщик интегрированной среды использует параметры, заданные в диалоговом окне Project Options. Командная строка TLINK имеет следующий синтаксис:
TLINK [@файл_подсказки][параметры] файл_запуска
объектн_файлы, имя_exe, [файл_map], [библиотеки]
библ_исп_системы [библ_импорта],
[файл_определений], [файлы_res]
"Параметры" - это параметры TLINK, управляющие его работой
(перед ними указывается символ "-" или "/"), "файл_запуска" - это
модуль инициализации Borland для выполняемых или DLL-файлов, определяющий порядок загрузки сегментов программы. Он должен следовать в списке объектных файлов первым. "Объектн_файлы" - это компонуемые объектные файлы .OBJ с указанием маршрута. "Имя_exe" -
это имя, назначаемое создаваемому выполняемому файлу (.EXE или
.DLL). Необязательное имя "файл_map" задает имя файла карты распределения памяти. Если имя не задается, то оно будет соответствовать имени исходного файла с добавлением расширения .MAP. "Библиотеки" - это указываемые при компоновке библиотечные файлы. Если
эти файлы не находятся в текущем каталоге или по маршруту поиска,
то нужно указать маршрут. "Библ_исп_системы" задает библиотеку
исполняющей системы Borland. Если библиотека не указывается, то
она не компонуется. "Библ_импорта" - это библиотека импорта Windows, обеспечивающая доступ к функциями API Microsoft Windows.
"Файл_определений" - это файл определения модуля (.DEF) для выполняемого файла Windows. Если он не задается, то приложение создается на основе заданных по умолчанию установок. "Файлы_res" задают список файлов ресурсов .RES, используемых для формирования
выполняемого файла.
Если у имен файлов отсутствуют расширения, то TLINK добавляет следующие расширения:
* .OBJ | - для объектных файлов;
|
* .EXE | - для выполняемых файлов (когда используется параметр
/t или /Td, выполняемый файл получает расширение .COM, а не
.EXE);
|
* .DLL | - для библиотек динамической компоновки (когда используется параметр /Twd или параметр /Tw и файл определения
модуля, задающий библиотеку);
|
* .MAP | - для файлов карты распределения памяти;
|
* .LIB | - для файлов библиотек;
|
* .DEF | - для файлов определения модуля.
|
* .RES | - для файлов ресурсов.
|
Файл TLINK.CFG
В файле конфигурации TLINK.CFG (или TLINK32.CFG) задаются
параметры, которые обычно указываются в командной строке (но не
имена файлов). Это позволяет не набирать каждый раз в командной
строке одни и те же параметры. TLINK ищет файл с именем TLINK.CFG
сначала в текущем каталоге, затем в каталоге, из которого эта
утилита загружалась.
TLINK.CFG является обычным текстовым файлом, содержащим
список допустимых параметров TLINK. В отличие от файла подсказки,
файл TLINK.CFG не может перечислять имена файлов для компоновки.
Файл подсказки
Файлы подсказки представляют собой обычные текстовые файлы,
содержащие параметры и/или имена файлов, которые обычно вводятся
после имени программы TLINK в командной строке. Однако, в отличие
от командной строки, файл подсказки может занимать несколько
строк текста. Вы можете разбить длинный список объектных файлов
или файлов библиотек на несколько строк, завершая одну строку
знаком "плюс" (+) и продолжая список на следующей строке. Когда
плюс возникает в конце строки, следуя непосредственно за одним из
параметров TLINK, в котором + используется для включения параметра (например, /ye+), плюс не рассматривается как символ продолжения строки.
Вы можете также начать каждый из четырех компонентов списка
на отдельных строках: объектные файлы, выполняемый файл, файл
карты отображения, библиотечные файлы. В этом случае вы должны
убрать запятую, используемую для разделения компонентов.
Чтобы проиллюстрировать эти возможности, предположим, что вы
пользуетесь следующей командной строкой:
tlink /c mainline wd ln tx,fin,mfin,work\lib\comm
work\lib\suррort
Вместо нее можно использовать файл подсказки, назвав его, например, FINRESP:
/c mainline wd+
ln tx,fin
mfin
worl\lib\comm work\lib\suррort
Теперь команду TLINK следует вводить следующим образом:
tlink @finresр
Заметьте, что имени файла должен предшествовать символ (@),
который указывает, что следующий файл является файлом подсказки.
Альтернативный способ заключается в том, что команду компоновки можно разбить на несколько файлов подсказки. Например,
представленную выше командную строку можно разбить на следующие
два файла подсказки:
Имя файла | Содержимое
|
---|
LISTOBJS | mainline+ wd+ ln tx
|
LISTLIBS | lib\comm+ lib\suррort
|
Теперь команду TLINK можно ввести в следующем виде:
tlink /c @listobjs,fin,mfin,@listlibs
Параметры командной строки переопределяют параметры, заданные в файле подсказки.
Использование TLINK c BCC.EXE
Параметры и файлы для компоновщика вы можете указать в командной строке компиляторов BCC и BCC32, указав явные расширения
.OBJ и .LIB. BCC запускает TLINK с файлами C0WS.OBJ, CWS.LIB и
IMPORT.LIB (модуль инициализации, библиотека исполняющей системы
и библиотека импорта Windows). BCC32 запускает TLINK32 с файлами
C0W32.OBJ, CW32.LIB и IMPORT32.LIB.
Компоновка библиотек
Всегда следует указывать компоновку с библиотекой исполняющей системы Borland С++, которая содержит стандартные библиотечные функции Borland С++ для того типа приложения, которое вы генерируете. Нужно также указать соответствующую библиотеку импорта
для 16-разрядных приложений, IMPORT32.LIB для консольных приложений или IMPRTW32.LIB для 32-разрядных приложений Windows. В следующей таблице описываются предусмотренные в Borland 16-разрядные
библиотеки Windows и файлы .OBJ.
Библиотеки и объектные файлы | Описание
|
---|
Cn.LIB | Библиотека исполняющей системы для приложений DOS, где n - это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
|
CWn.LIB | Библиотека исполняющей системы для приложений Windows 3.x, где n - это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
|
CRTLDLL.LIB | Библиотека исполняющей системы для DLL Windows.
|
IMPORT.LIB | Библиотека импорта для функций API Windows
3.x.
|
C0n.OBJ | Код запуска для приложений .EXE DOS, где n
- это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
|
C0Wn.OBJ | Код запуска для приложений Windows, где n
- это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
|
C0Dn.OBJ | Код запуска для модулей DLL Windows, где n
- это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
|
MATHWS.LIB | Математическая библиотека для моделей Small и Tiny (если программа использует операции с плавающей точкой).
|
MATHWC.LIB | Математическая библиотека для модели Compact.
|
MATHWM.LIB | Математическая библиотека для модели Medium.
|
MATHWL.LIB | Математическая библиотека для модели
Large.
|
В следующей таблице описываются 32-разрядные библиотеки и
файлы .OBJ Borland С++, которые используются компоновщиком
TLINK32.
Библиотеки и объектные файлы | Описание
|
---|
CW32.LIB | Библиотека исполняющей системы для приложений Win32.
|
IMPORT32.LIB | Библиотека импорта для консольных приложений и 32-разрядных приложений Windows.
|
C0X32.OBJ | Код запуска для консольных приложений.
|
C0W32.OBJ | Код запуска для приложений Win32.
|
C0D32.OBJ | Код запуска для 32-разрядных модулей Windows.
|
Параметр TLINK
Если не указано обратное, описываемые ниже параметры действуют как для TLINK, так и для TLINK32. Регистр параметров различается. Перед параметрами нужно указывать - или /. Отключить заданный по умолчанию параметр можно указанием после него символа
"-", например -P-.
Параметр | Команда IDE Linker | Описание
|
---|
/3 | Linker 16-bit Linker Enable 32-bit processing | Выполняет компоновку 32- разрядного кода, создаваемого TASM или совместимого с ним ассемблера.
|
/aa | Target Attributes Target Model | Задает целевое приложение
Windows.
|
/ap | Target Attributes Target Model | Задает целевое консольное
приложение.
|
/A:dd | 16-bit Segment Alignment | Задает выравнивание страницы в файле .EXE.
|
/B:xxxxxx | 32-bit Linker Image base address | Задает базовый адрес образа для 16-разрядных
приложений (в шестнадцатиричном виде).
|
/c | General Case-sensitive link | Различает регистр символов в идентификаторах.
|
/C | General Case-sensitive exports, imports | Различает регистр в секциях EXPORTS и IMPORTS файла определения модуля.
|
/d | Warnings Warn duplicate symbol in .LIB | Предупреждает о дублировании идентификатора в
библиотеке.
|
/E | 16-bit Linker Process extended dictionaries | Разрешает обработку в библиотеке расширенных
словарей.
|
/Enn | 32-bit Linker Maximum linker errors | Задает максимальное число
ошибок, после которого
обработка прекращается.
|
/e | 16-bit Process extended Dictionaries | Игнорирует расширенные
словари в библиотеках. (отмена)
|
/f | 16-bit Linker Inhibit optimizing far to near | Запрещает оптимизацию вызовов ближних данных.
|
/Gn | 16-bit Linker Discard nonresident name table | Выгрузка нерезидентной
таблицы имен.
|
/Gr | 16-bit Transfer resident to nonresident table | Преобразует резидентные
имена в нерезидентную
таблицу имен.
|
/Gm | Map File Print mangled names in map file | Включает в файл map правленные имена.
|
/i | 16-bit Linker Initialize segments | Инициализирует все сегменты.
|
/l | Map File Include source line numbers | Включает номера строк исходного текста.
|
/L | Directory Library (кроме IDE) | Задает маршруты поиска
библиотек.
|
/m | Map File Public | Создает файл map с общедоступными идентификаторами.
|
/m | General Default Libraries | Не использует заданные по
умолчанию библиотеки.
|
/o | Overlay module (атри бутокна) | Оверлейные модули или
узла диалогового библиотеки
|
/P | General Pack code segments | Упаковка сегментов кода.
|
/Rk | Resource Pack fast load area (не в Linker) | Задает параметры RLINK.
.EXE.
|
/Rv | нет ресурсов. | Расширенная компоновка
|
/Rexxxx | нет | Переименовывает выполняемый файл в xxxx.
|
/S:xxxxx | 32-bit Linker Stack size | Задает размер стека (в
шестнадцатиричном виде).
|
/s | Map File Detailed | Создает детальную схему
сегментов.
|
/t | нет | Создает файл .COM для
DOS (модель tiny).
|
/Tdc | нет | Построение файла .COM
DOS.
|
/Tde | нет | Построение файла .EXE
DOS.
|
/Tpc | TargetExpert Platform | Задает в качестве целевого приложения 32-разрядный файл .EXE.
|
/Tpd | TargetExpert Platform | Задает в качестве целевого приложения 32-разрядный файл .DLL.
|
/Twd | TargetExpert Target Type | Задает целевое приложение
Windows (файл .EXE).
|
/Twd | TargetExpert Target Type | Задает целевое приложение
Windows (файл .DLL).
|
/v | General Include debug information | Включает полную отладочную информацию.
|
/wxxx | Уровень предупреждений | Разрешает или запрещает
предупреждения.
|
/x | Map File Off | Не создает файл map.
|
/ye | нет | Использует для свопинга
дополнительную память.
|
/yx | нет | Использует для свопинга
TLINK расширенную память.
|
Файл определения модуля
В данном разделе описываются файлы определения модуля и операторы, которые в них содержатся. Файл определения модуля обеспечивает для TLINK информацию о содержимом приложения Windows и
требованиях к системе:
- Имена прикладной программы или библиотеки динамической
компоновки (DLL).
- Идентификация типа прикладной программы как программы для
Windows или OS/2.
- Перечисление импортируемых и экспортируемых функций.
- Описание атрибутов сегментов кода и данных; позволяет вам
задавать атрибуты для дополнительных сегментов кода и данных.
- Размеры динамически распределяемой области и стека.
- Обеспечивает фиктивный модуль программы.
Заметим, что утилита IMPLIB может использовать файл определения модуля для создания библиотеки импорта. Утилита IMPDEF может создавать файл определения модуля для использования его с
IMPLIB.
Оператор CODE
Оператор CODE определяет стандартные атрибуты сегментов кода. Сегменты кода могут иметь любое имя, но должны принадлежать
классам сегментов, имена которых оканчиваются на CODE. Например,
корректными именами классов сегментов являются CODE и MYCODE.
Оператор имеет следующий синтаксис:
Для TLINK:
CODE [FIXED MOVEABLE]
[DISCARDABLE NONDISCARDABLE]
[PRELOAD LOADONCALL]
Для TLINK32:
[PRELOAD LOADONCALL]
[EXECUTEONLY EXECUDEREAD]
FIXED означает, что сегмент занимает фиксированное положение
в памяти; MOVEABLE означает, что сегмент может перемещаться.
DISCARDABLE означает, что сегмент может отбрасываться, если
он больше не нужен. DISCARDABLE подразумевает MOVEABLE.
NONDISCARDABLE означает, что сегмент не может отбрасываться.
PRELOAD означает, что сегмент загружается при первой загрузке модуля; LOADONCALL означает, что сегмент загружается, когда
вызывается код, находящийся в этом сегменте. Компилятор ресурсов
и загрузчик Windows устанавливают сегмент кода, содержащий начальную точку входа в программу, в значение PRELOAD независимо от
содержания файла определения модуля.
EXECUTEONLY означает, что сегмент кода может быть только выполняемым. EXECUTEREAD означает, что сегмент кода может считываться и выполняться.
Оператор DATA
Оператор DATA определяет стандартные атрибуты сегментов данных и имеет синтаксис:
DATA [NONE SINGLE MULTIPLE]
[READONLY LOADCALL]
[PRELOAD LOADONCALL]
[SHARED NONSHARED]
NONE означает отсутствие сегмента данных. Если задается
NONE, то другие параметры использовать нельзя. Этот параметр
используется только для библиотек.
READONLY означает, что сегмент данных может только считыватьcя. READWRITE означает чтение и запись в сегмент данных.
PRELOAD означает, что сегмент данных загружается при первой
загрузке модуля. LOADONCALL (по умолчанию) означает, что сегмент
данных загружается при первом обращении (для 32-разрядных приложений это игнорируется).
SHARED (по умолчанию для 16-разрядных приложений) означает,
что одна копия сегмента данных совместно используется всеми процессами. NONSHARED (по умолчанию для программ и 32-разрядных DLL)
означает, что копия сегмента данных загружается для каждого процесса, которому требуется использовать сегмент данных.
Оператор DESCRIPTION
DESCRIPTION вставляет текст в модуль прикладной программы.
Оператор DESCRIPTION обычно используется для вставки автора, даты
или информации о копировании. Оно является необязательным параметром. Оператор имеет синтаксис:
DESCRIPTION 'текст'
где "текст" является строкой ASCII, разделенной одинарными кавычками.
Оператор EXETYPE
EXETYPE задает стандартный тип заголовка (Windows или OS/2)
выполняемого файла (.EXE) для 16-разрядных приложений. В 32-разрядных приложениях для обратной совместимости этот оператор можно
сохранить. В данной версии Borland C++ можно задавать только значение WINDOWS. Оператор имеет синтаксис:
EXETYPE WINDOWS
Оператор EXPORTS
EXPORTS определяет имена и атрибуты экспортируемых функций.
Ключевое слово EXPORTS отмечает начало определений. После него
может следовать любое число определений экспорта, каждое в отдельной строке. Оператор имеет синтаксис:
EXPORTS
имя_эксп [номер] [RESIDENTNAME] [параметр]
где "имя_эксп" задает строку ASCII, которая определяет экспортируемый идентификатор. Она имеет следующую форму:
имя_точки_входа [=внутр_имя]
где "внутр_имя" является именем, используемым внутри прикладной
программы для ссылки на эту точку входа. "Имя_точки_входа" является именем, приведенным в таблице точек входа выполняемого файла, и может быть "видимо" извне.
"Номер" определяет значение перечисления функции. Оно имеет
следующую форму:
@номер
где "номер" является целым значением, которое определяет значение
перечисления функции.
Когда модуль прикладной программы или модуль DLL вызывает
функцию, экспортируемую из DLL, вызывающий модуль может ссылаться
на функцию по имени или по значению перечисления. С точки зрения
скорости, ссылка на функцию по перечислению является более быстрой, так как сравнения строк не требуют определения местоположения функции. С точки зрения распределения памяти, экспортирование
функции по перечислению (с точки зрения DLL этой функции) и импортирование/вызов функции по перечислению (с точки зрения модуля
вызова) являются более эффективными.
Когда функция экспортируется по номеру, имя располагается в
нерезидентной таблице имен, а когда по имени, то в резидентной
таблице имен. Резидентная таблица имен для модуля является резидентной в памяти всякий раз, когда модуль загружен; с нерезидентной таблицей имен этого не происходит.
Параметр RESIDENTNAME позволяет указывать, что имя функции
должно быть всегда резидентным. Это используется только тогда,
когда производится экспортирование по перечислению (когда имя не
будет резидентным по умолчанию).
"Параметр" является необязательным целым значением, задающим
число слов, ожидаемых функцией в качестве параметров.
Оператор IMPORTS
IMPORTS определяет имена и атрибуты функций, импортируемых
из библиотеки динамической компоновки. Вместо перечисления функций DLL в IMPORTS, вы можете задать библиотеку импорта для DLL в
командной строке TLINK или (в IDE) включить библиотеку импорта
для DLL в проект.
Ключевое слово IMPORTS указывает начало определений. После
него может идти любое число определений импорта, каждое в отдельной строке. Оператор имеет синтаксис:
IMPORTS [внутр_имя=]имя_модуля.точка_входа
где "внутр_имя" является строкой ASCII, определяющей уникальное
имя, которое будет использоваться прикладной программой для вызова функции.
Поле "имя_модуля" задает один или несколько символов ASCII в
верхнем регистре, которые определяют имя выполняемого модуля, со-
держащего функцию. Имя модуля должно быть согласовано с именем
исполнимого файла. Например, файл SAMPLE.DLL имеет имя модуля
SAMPLE.
Поле "точка_входа" задает импортируемую функцию. Она может
быть строкой ASCII, которая именует функцию, или целым, которое
задает значение перечисления функции.
Оператор LIBRARY
LIBRARY определяет имя модуля DLL. Файл определения модуля
может содержать или оператор NAME для указания прикладной программы или утверждение LIBRARY для указания DLL, но не оба оператора одновременно.
Подобно имени модуля прикладной программы, имя модуля библиотеки должно соответствовать имени выполняемого файла. Например,
библиотека MYLIB.DLL имеет имя модуля MYLIB. Оператор имеет следующий синтаксис:
LIBRARY имя_библиотеки [INITGLOGAL INITINSTANCE]
где "имя_библиотеки" задает строку ASCII, которая определяет имя
модуля библиотеки. Если вы не указываете имя, то TLINK использует
имя исходного файла без расширения. Если файл определения модуля
не содержит операторов NAME или LIBRARY, то TLINK подразумевает
оператор NAME без параметра имени библиотеки.
INITGLOBAL означает, что подпрограмма инициализации модуля
вызывается только при первой загрузки библиотечного модуля в память. INITINSTANCE означает, что подпрограмма инициализации модуля вызывается каждый раз, когда новый процесс использует библиотеку.
Оператор NAME
NAME определяет имя выполняемого модуля прикладной программы. Имя модуля идентифицирует модуль, который экспортирует функции. Оператор имеет синтаксис:
NAME имя_модуля [WINDOWSAPI] [WINDOWCOMPAT]
где "имя_модуля" задает один или несколько символов ASCII в
верхнем регистре, которые определяют имя выполняемого модуля. Имя
модуля должно соответствовать имени выполняемого файла. Например,
прикладная программа с выполняемым файлом SAMPLE.EXE имеет имя
модуля SAMPLE.
Параметр "имя_модуля" не является обязательным. Если параметр не включен, TLINK считает, что имя модуля соответствует имени выполняемого файла. Например, если вы не задали имя модуля, а
выполняемый файл имеет имя MYAPP.EXE, то TLINK считает, что модуль имеет имя MYAPP.
Если файл определения модуля не включает ни утверждения
NAME, ни утверждения LIBRARY, TLINK использует утверждение NAME
без параметра "имя_модуля".
WINDOWSAPI задает выполняемый файл Windows (эквивалент пара-
метра /aa TLINK32).
WINDOWCOMPAT определяет совместимый с Windows выполняемый
файл символьного режима (эквивалент параметр /ap TLINK32).
Оператор SEGMENTS
SEGMENTS определяет атрибуты добавочных сегментов кода и
данных и имеет синтаксис:
SEGMENTS
имя_сегмента [CLASS 'имя_класса'] [мин_распр]
[SHARED NONSHARED]
[PRELOAD LOADONCALL]
где имя_сегмента задает символьную строку, именующую новый сегмент. Это может быть любое имя, включая стандартные имена сегментов _TEXT и _DATA, представляющее стандартные сегменты кода и данных.
Поле "имя_класса" является необязательным ключевым словом,
задающим имя класса для указанного сегмента. Если не задано имя
класса, то TLINK использует стандартное имя класса CODE.
Поле "мин_распр" является необязательным целым значением,
задающим минимальный размер распределения для сегмента. Обычно
TLINK это значение игнорирует.
SHARED (задается по умолчанию для 16-разрядных DLL) означает, что одна копия сегмента совместно используется процессами.
NONSHARED (задается по умолчанию для программ и 32-разрядных DLL)
означает, что каждого процесса требуется своя копия сегмента.
PRELOAD означает, что сегмент загружается сразу же;
LOADONCALL означает, что сегмент загружается, когда к нему происходит обращение или осуществляется доступ (в TLINK32 игнорируется). Компилятор ресурсов может переопределить параметр LOADONCALL и загружать сегменты предварительно.
Оператор STACKSIZE
Оператор STACKSIZE определяет число байт, требуемых для локального стека прикладной программы. Прикладная программа использует локальный стек всякий раз, когда делает вызов функции. Для
библиотек DLL STACKSIZE использовать нельзя. Оператор имеет синтаксис:
STACKSIZE байты
где "байты" является целым значением, задающим размер стека в
байтах.
Оператор STUB
STUB присоединяет выполняемый файл DOS, заданный с помощью
поля "имя_файла", в начало модуля. Если пользователь не загрузил
Windows, то выполняемый фиктивный модуль должен выдавать предупреждающее сообщение и прекращать выполнение программы.
Если в операторе STUB не указан другой фиктивный модуль,
Borland C++ добавляет в начало прикладной программы встроенный
фиктивный модуль. Поэтому, оператор STUB не нужно использовать
для того, чтобы просто включить WINSTUB.EXE, так как компоновщик
будет делать это для вас автоматически.
Оператор имеет синтаксис:
STUB "имя_файла"
где "имя_файла" задает имя выполняемого файла DOS, который будет
присоединен к модулю. Имя должно иметь формат файла DOS.
Если файл с именем "имя_файла" не находится в текущем каталоге, TLINK ищет файл в каталогах, заданных с помощью пользовательской переменной среды PATH.
Стандартный файл определения модуля
Файл определения модуля не является строго обязательным для
создания выполняемой программы Windows с использованием Borland
C++. Если файл определения модуля не задан, по умолчанию принимается следующее:
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE (для прикладных про-
грамм) или
PRELOAD MOVEABLE SINGLE (для DLL)
HEAPSIZE 4096
STACKSIZE 5120 (для TLINK32 1048576)
Для замены утверждения EXETYPE компоновщик Borland C++ может
определять вид выполняемой программы, которую вы хотите создать с
помощью IDE или компилятора командной строки.
Вы можете включать библиотеку импорта для замены секции
IMPORTS определения модуля.
Для того, чтобы не нужно было указывать секцию EXPORTS, вы
можете использовать ключевое слово _exрort в определениях функций
экспорта в вашей исходной программе на языке Си или C++. Заметим,
однако, что если для экспорта функции используется _exрort, то
функция будет экспортироваться по имени, а не по перечислению
(перечисление обычно более эффективно).
Если вы хотите изменить стандартные атрибуты, вам необходим
файл определения модуля.
Инструментальные средства для работы с ресурсами
В пакет Borland С++ входят следующие инструментальные средства для работы с ресурсами:
- Компиляторы ресурсов BRCC.EXE и BRCC32.EXE. Они компилируют файлы сценариев ресурсов (.RC) и создают двоичный файл
.RES.
- Компоновщики ресурсов RLINK.EXE и RLINK32.EXE используются
для компоновки ресурса в файл .RES, .EXE или создают выполняемый файл Windows (через TLINK).
- Borland BRC.EXE и BRC32.EXE - это оболочки, позволяющие
запускать BRCC и RLINK за один шаг.
Большинство программ Windows легко использовать, так как они
обеспечивают стандартный интерфейс с пользователем. Например,
большинство программ Windows, позволяющие вам реализовать команды
программы и изменять курсоры, что позволяет указателю "мыши"
представлять большой набор инструментальных средств, таких как
стрелки или кисти.
Меню и курсоры представляют два примера ресурсов программ
Windows. Ресурсы - это данные, записываемые в выполняемый файл
программы (.EXE) отдельно от обычных ее данных. Ресурсы определяются и задаются вне кода программы, а затем добавляются к скомпилированному коду программы для создания выполняемого файла программы.
Ресурсы определяются как внешние для вашего программного кода данные, а затем они подключаются к выполняемому файлу в процессе компоновки. Приложение вызывает ресурсы в память только при
необходимости, что минимизирует использование памяти.
Чаще всего создавать и использовать вы будете следующие
ресурсы:
- меню;
- диалоговые блоки;
- тограммы;
- затели;
- соры;
- елераторы клавиатуры (оперативные клавиши);
- овые массивы;
- шрифты;
- символьные строки.
Файлы сценариев ресурсов - это текстовые файлы, которые описывают конкретный ресурс приложения. Создать ресурсы вы можете с
помощью редактора ресурсов или компилятора ресурсов. В большинстве случаев проще всего использовать редактор ресурсов и визуально создать ресурсы. Однако иногда удобно использовать для компиляции файлов манускрипта, которые встречаются в книгах или журналах, компилятор ресурсов.
Независимо от того, какой подход вы используете, с помощью
RC или BRCC обычно создается файл ресурса (.RES) для каждой прикладной программы. Данный файл ресурсов содержит двоичную информацию для всех меню, диалогов, растровых образов и других ресурсов, используемых в прикладной программе.
Двоичный файл ресурсов, добавляемый к вашей прикладной программе (.EXE) с помощью компилятора ресурсов, описывается в данной
главе ниже. Вы должны также написать код, который загружает ресурсы в память. Каждый ресурс требуется загружать в память отдельно. Это дает вам гибкость, поскольку ваша программа будет использовать память только для тех ресурсов, которые действительно
нужны.
Компилятор ресурсов BRCC.EXE
BRCC - это версия компилятора ресурсов Resource Workshop,
работающая в режиме командной строки. Его входным файлом является
файл сценария ресурсов (.RC), а на выходе создается объектный
файл ресурса (.RES). BRCC использует следующий синтаксис командной строки:
BRCC [параметры] <имя_файла>.RC
Параметры BRCC перечислены в следующей таблице. Регистр сим-
волов в них значения не имеет.
Параметр | Описание
|
---|
@файл_подсказки | Воспринимает инструкции из заданного
файла.
|
-d<имя>[=<строка>] | Определяет идентификатор препроцессора.
|
-fo<имя_файла> | Переименовывает выходной файл .RES (по
умолчанию имя этого файла совпадает с
именем исходного файла).
|
-i<маршрут> | Добавляет к маршруту поиска один или
более каталогов.
|
-r | Этот параметр игнорируется и включен
для совместимости с другими компиляторами ресурсов.
|
-v | Выводит сообщения о ходе процесса.
|
-x | Определяет текущий маршрут поиска включаемых файлов.
|
-? или -h | Выводит справочную информацию о параметрах.
|
-30 | Строит файлы .RES, совместимые с Windows 3.0.
|
-31 | Строит файлы .RES, совместимые с Windows 3.1.
|
-w32 | Строит файлы .RES, совместимые с Win32.
|
Как и компилятор ресурсов в Resource Workshop, BRCC имеет
связанные с ресурсами предопределенные константы, такие как
WS_VISIBLE и BS_PUSHBUTTON. Кроме того, определены два специальных идентификатора RC_INVOKED и WORKSHOP_INVOKED, которые используются в тексте ресурса в сочетании с условными директивами препроцессора для управления компиляцией.
Назад | Содержание | Вперед