WinSpector и ее утилиты помогают вам выполнить послесбойную проверку невосстановимых ошибок прикладной программы Windows - Windows Unrecoverable Application Errors (UAE) и сбоев по общему нарушению защиты General Protection Faults (GPF). В случае подобных ошибок 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 можно настроить таким образом, чтобы она лучше соответствовала вашим потребностям. Это позволяет управлять выводом информации в файл WINSPCTRL.LOG.
Параметры WinSpector можно устанавливать в диалоговом окне Preferences или с помощью ввода команд непосредственно в файл WINSPCTR.INI.
Параметр Directory в диалоговом окне Preferences позволяет вам решить, куда записывается файл регистрации. Если вы не задаете каталог, то по умолчанию используется каталог Windows.
Для задания каталога сделайте следующее:
Параметр Viewer диалогового окна Preferences позволяет задать, какое программное средство нужно использовать для просмотра файла регистрации. Если вы не задаете каталог, то по умолчанию используется Windows Notepad.
Если исключительная ситуация возникает в процессе сеансе с текущим окном Windows, чтобы увидеть файл регистрации, выберите View Log (Просмотр файла регистрации) диалогового окна Latest UAE или диалоговое окно Preferences. Команда View Log запускает выбранную программу просмотра и передает файл WINSPCTR.LOG в качестве аргумента командной строки.
Чтобы просмотреть предыдущий файл регистрации, выберите в системном меню WinSpector команду View Log file.
Чтобы задать средство просмотра, сделайте следующее:
Параметры Append New Reports и Overwrite Previous Reports в диалоговом окне Preferences позволяет вам либо добавить отчеты к предыдущему файлу регистрации, либо затереть предыдущий файл регистрации при генерации нового отчета. По умолчанию задается затирание предыдущего файла.
Если вы выбираете перезапись предыдущего файла регистрации, то при первом возникновении исключительной ситуации предыдущий файл регистрации затирается. Последующие исключительные ситуации, возникающие в процессе текущего сеанса работы с Windows, будут добавлять информацию к этому файлу.
Чтобы добавлять отчеты к предыдущему файлу регистрации, сделайте следующее:
Чтобы затирать предыдущие файлы регистрации, сделайте следующее:
Параметр System Information в диалоговом окне Preferences позволят вам добавить в файл регистрации список задач Task List, список модулей Module List, и информацию о динамически распределяемой области памяти пользователя (USER) и GDI. По умолчанию в отчет включается системная информация.
Чтобы включить системную информацию в файл регистрации, сделайте следующее:
Чтобы системная информация не включалась в файл регистрации, сделайте следующее:
Параметр AUX Summary в диалоговом окне Preferences указывает WinSpector, что на устройство AUX нужно выводить сокращенную форму отчета. Чтобы использовать данный параметр, нужно подключить к AUX терминал или драйвер устройства, который перенаправляет AUX на второй монитор. По умолчанию информация на AUX не выводится.
Для передачи итогового отчета на устройство AUX сделайте следующее:
Чтобы итоговый отчет не передавался на устройство AUX сделайте следующее:
Параметр Stack Frame Data в диалоговом окне Preferences позволяет вам выполнить подробную трассировку стека в файл регистрации. Для кадра стека не превышающего 256 байт выполняется шестнадцатиричный дамп, начиная с SS:BP для кадра стека. Если между двумя последовательными кадрами стека больше 256 байт, то показ памяти для этого кадра опускается. Эти данные можно использовать для получения значений или параметров, которые передавались функции. По умолчанию подробная трассировка стека не выполняется.
Обычно для выявления значений параметров существенно проще использовать утилиту DFA. Однако в тех случаях, когда вам недоступна информация отладчика, может оказаться полезной подробная трассировка стека. Чтобы добавить данные трассировки стека в файл регистрации, сделайте следующее:
Чтобы не включать данные кадра стека в файл регистрации, сделайте следующее:
Параметр PostMortem Dump в диалоговом окне Preferences генерирует файл WINSPCTR.BIN.
Утилита DFA воспринимает файл WINSPCTR.BIN и информацию Турбо отладчика (файлы .TDS) и транслирует непосредственные двоичные данные в полезную форму. Она генерирует файл, содержащий трассировку стека аналогичную той, что выводится в файл регистрации, но с именами функций и номерами строк, а также локальными и глобальными переменными.
Генерация файла WINSPCTR.BIN:
Чтобы не генерировать файл WINSPCTR.BIN, сделайте следующее:
Параметр User Comments в диалоговом окне Preferences позволяет вам ввести информацию о том, что происходило во время возникновения исключительной ситуации. Диалоговое окно выводится немедленно после записи файла регистрации, и в это время можно ввести комментарии о том, что произошло. Ваши комментарии будут добавляться к файлу регистрации.
Чтобы добавить комментарии пользователя в файл регистрации, сделайте следующее:
Чтобы не включать комментарии пользователя в файл регистрации, сделайте следующее:
Первая строка в отчете (отчетах) WINSPCTR.LOG показывает вам дату и время возникновения исключительной ситуации. На второй строке перечисляется:
Если указатель стека во время исключительной ситуации слишком мал, TOOLHELP.DLL автоматически переключает стек. Когда это происходит, в конце второй строки файла регистрации выводится сообщение "Stack Switched".
Первая строка раздела дизассемблера файла регистрации указывает, что вызвало исключительную ситуацию.
После этого следуют несколько инструкций программы. Эти последующие команды перечисляются для обеспечения ссылок с целью нахождения вызвавшей особую ситуацию задачи.
Первая строка раздела трассировки стека файла регистрации идентифицирует функцию или процедуру, которая выполнялась во время исключительной ситуации. Stack Trace information включает в себя:
Когда WinSpector дает имена функций, он ищет в файле .SYM ближайший идентификатор, который встречается перед адресом стека вызова. Некоторые файлы .SYM не содержат информации обо всех инструкциях. Таким образом, имя функции в файле регистрации будет представлять ближайшую функцию в файле .SYM с адресом, предшествующим адресу стека. Если поле смещение показывает слишком большое значение, то имя функции подозрительно.
Раздел регистров файла регистрации представляет значения, которые находились в стандартных регистрах во время исключительной ситуации. Для регистров CS, DS, ES и SS даны ограничения и полномочия доступа.
Раздел очереди сообщений файла регистрации представляет: последнее сообщение, фактически полученное в ходе обработки. Кроме того, дается список сообщений, ожидающих в очереди во время исключительной ситуации. Перечисляется следующая информация:
То, что записывается в разделе очереди сообщений, может фактически не быть реальным последним сообщением, полученным программой. Windows может обходить очередь сообщений (используя, например, функцию SendMessage). При использовании информации об очереди сообщений нужно иметь это в виду. Раздел задач
В разделе задач файла регистрации перечисляются все программы, работающие в системе во время возникновения исключительной ситуации. Здесь приводится следующая информация:
В разделе модулей файла регистрации перечисляются модули, которые выполнялись во время возникновения исключительной ситуации. Здесь приводится следующая информация:
Информация о пользовательской динамически распределяемой области памяти USER и динамической памяти GDI показывается, какой процесс динамической памяти USER и GDI был доступен во время исключительной ситуации.
В разделе системной информации файла регистрации показывается режим и версия Windows, под которой выполняется ваша программа. Показывается также следующее:
Утилита DFA обрабатывает информацию Турбо отладчика, собранную WinSpector во время возникновения исключительной ситуации. Если во время исключительной ситуации информация отчета установлена в PostMortem Dump, то WinSpector записывает файл WINSPCTR.BIN. После этого для трансляции файла WINSPCTR.BIN в полезный формат можно использовать утилиту DFA.
Утилита DFA записывает файл только в том случае, если в кадре стека для файла присутствует информация отладчика Turbo Debugger. Выходной файл DFA (DFA.OUT) содержит трассировку стека, аналогичную файлу регистрации WinSpector. Кроме того, там находится следующее:
Во время сеанса работы в Windows записывается только один файл WINSPCTR.BIN, поэтому построцессорная обработка файла выполняется с подсказкой. При этом вы можете удалить или переименовать файлы DFA.OUT и WINSPCTR.LOG, что позволит отследить за один сеанс более одной исключительной ситуации.
При использовании только с файлом WINSPCTR.LOG утилита DFA дает минимальную информацию трассировки стека, такую как адреса. Когда в выполняемом файле или в отдельном файле присутствует информация отладчика (файл .TDS), к отчету добавляются имена исходных файлов и номера строк.
При использовании файла WINSPCTR.BIN утилита DFA делает доступной следующую дополнительную информацию:
При наличии файла отладчика .TDS для каждого кадра стека утилита DFA сообщает:
Синтаксис: DFA [параметр] WINSPCTR.LOG [WINSPCTR.BIN]
Необходим файл WINSPCTR.LOG. При его наличии вы получаете информацию об исходном файле и номерах строк. При наличии файла WINSPCTR.BIN (который не обязателен) вы получите дополнительную информацию о переменной.
Параметр | Действие |
---|---|
/O[выходной_файл] | Переименовывает выходной файл (по умолчанию DFA.OUT). |
/D | Вынуждает DFA записывать шестнадцатиричный дамп сохраненных сегментов данных. |
EXEMAP, TMAPSYM и BUILDSYM представляют собой три утилиты, которые улучшают вид информации, которую WinSpector обеспечивает для исключительной ситуации.
Файлы .MAP для выполняемых файлов Windows создает утилита EXEMAP. Файл .MAP можно использовать для создания файла .SYM, который затем используется WinSpector для улучшения отчета об ошибках. Это может быть особенно полезным для использования с .DLL или другими программами, для которых у вас нет исходного кода.
Хотя полученный в результате файл .MAP не будет таким пол- ным, как сгенерированных компоновщиком, он содержит адреса экспортируемых общедоступных функций.
Синтаксис: EXEMAP имя_выполняемого_файла [выходной_файл_map]
Если [выходной_файл_map] и не задается, то по умолчанию это будет имя_выполняемого_файла.MAP.
Утилита TMAPSYM создает файлы .SYM из существующих файлов .MAP. (созданных либо TLINK, либо утилитой EXEMAP). Результирующий файл .SYM содержит информацию о доступных для WinSpector функции public, именах переменных и функциях в таблице входа. Константы и информация о номерах строк в генерируемый утилитой TMAPSYM файл .SYM не включается.
Синтаксис: TMAPSYM имя_файла[.MAP]
Расширение .MAP не обязательно.
Прекомпилированные файлы заголовков Borland C++ используют расширения .SYM и могут быть случайно затерты при генерации файла идентификаторов .SYM. Если вы используете компилятор, работающий в режиме командной строки, то можете указать параметр для переименования файла заголовка, чтобы избежать подобного конфликта имен.
BUILDSYM перезаписывает любой существующий файл .SYM. Для надежности перед использованием утилиты BUILDSYM или TMAPSYM скопируйте существующие файлы .SYM.
Утилита BUILDSYM предлагает удобный способ для создания файлов .SYM для одного или более выполняемых файлов в каталоге.
Когда файлы .SYM недоступны, создание их без BUILDSYM за два шага:
Утилита BUILDSYM использует EXEMAP и TMAPSYM, но полный процесс можно выполнить с помощью только одной команды. BUILDSYM после создания файлов .SYM стирает также из каталога файлы .MAP. Утилита BUILDSYM поддерживает синтаксис, позволяющий использовать трафаретные символы, что дает вам возможность создавать файлы .SYM для всех файлов каталога или части файлов с помощью одной команды.
BUILDSYM требует, чтобы утилиты EXEMAP и TMAPSYM указывались в маршруте доступа. Полученные в результате файлы .SYM помещаются в текущий каталог. Чтобы WinSpector могла найти файл .SYM, при возникновении исключительной ситуации он должен находиться в том же каталоге, что и выполняемый файл.
Утилита BUILDSYM делает следующее:
Синтаксис: BUILDSYM имя_файла
В имени файла допускается указывать трафаретные символы DOS.
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 (или 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 /c @listobjs,fin,mfin,@listlibsПараметры командной строки переопределяют параметры, заданные в файле подсказки.
Параметры и файлы для компоновщика вы можете указать в командной строке компиляторов 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, так и для 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 и требованиях к системе:
Заметим, что утилита IMPLIB может использовать файл определения модуля для создания библиотеки импорта. Утилита IMPDEF может создавать файл определения модуля для использования его с IMPLIB.
Оператор 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 [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 'текст'где "текст" является строкой ASCII, разделенной одинарными кавычками.
EXETYPE задает стандартный тип заголовка (Windows или OS/2) выполняемого файла (.EXE) для 16-разрядных приложений. В 32-разрядных приложениях для обратной совместимости этот оператор можно сохранить. В данной версии Borland C++ можно задавать только значение WINDOWS. Оператор имеет синтаксис:
EXETYPE WINDOWS
EXPORTS определяет имена и атрибуты экспортируемых функций. Ключевое слово EXPORTS отмечает начало определений. После него может следовать любое число определений экспорта, каждое в отдельной строке. Оператор имеет синтаксис:
EXPORTS имя_эксп [номер] [RESIDENTNAME] [параметр]
где "имя_эксп" задает строку ASCII, которая определяет экспортируемый идентификатор. Она имеет следующую форму:
имя_точки_входа [=внутр_имя]
где "внутр_имя" является именем, используемым внутри прикладной программы для ссылки на эту точку входа. "Имя_точки_входа" является именем, приведенным в таблице точек входа выполняемого файла, и может быть "видимо" извне.
"Номер" определяет значение перечисления функции. Оно имеет следующую форму:
@номер
где "номер" является целым значением, которое определяет значение перечисления функции.
Когда модуль прикладной программы или модуль DLL вызывает функцию, экспортируемую из DLL, вызывающий модуль может ссылаться на функцию по имени или по значению перечисления. С точки зрения скорости, ссылка на функцию по перечислению является более быстрой, так как сравнения строк не требуют определения местоположения функции. С точки зрения распределения памяти, экспортирование функции по перечислению (с точки зрения DLL этой функции) и импортирование/вызов функции по перечислению (с точки зрения модуля вызова) являются более эффективными.
Когда функция экспортируется по номеру, имя располагается в нерезидентной таблице имен, а когда по имени, то в резидентной таблице имен. Резидентная таблица имен для модуля является резидентной в памяти всякий раз, когда модуль загружен; с нерезидентной таблицей имен этого не происходит.
Параметр RESIDENTNAME позволяет указывать, что имя функции должно быть всегда резидентным. Это используется только тогда, когда производится экспортирование по перечислению (когда имя не будет резидентным по умолчанию).
"Параметр" является необязательным целым значением, задающим число слов, ожидаемых функцией в качестве параметров.
IMPORTS определяет имена и атрибуты функций, импортируемых из библиотеки динамической компоновки. Вместо перечисления функций DLL в IMPORTS, вы можете задать библиотеку импорта для DLL в командной строке TLINK или (в IDE) включить библиотеку импорта для DLL в проект.
Ключевое слово IMPORTS указывает начало определений. После него может идти любое число определений импорта, каждое в отдельной строке. Оператор имеет синтаксис:
IMPORTS [внутр_имя=]имя_модуля.точка_входа
где "внутр_имя" является строкой ASCII, определяющей уникальное имя, которое будет использоваться прикладной программой для вызова функции.
Поле "имя_модуля" задает один или несколько символов ASCII в верхнем регистре, которые определяют имя выполняемого модуля, со- держащего функцию. Имя модуля должно быть согласовано с именем исполнимого файла. Например, файл SAMPLE.DLL имеет имя модуля SAMPLE.
Поле "точка_входа" задает импортируемую функцию. Она может быть строкой ASCII, которая именует функцию, или целым, которое задает значение перечисления функции.
LIBRARY определяет имя модуля DLL. Файл определения модуля может содержать или оператор NAME для указания прикладной программы или утверждение LIBRARY для указания DLL, но не оба оператора одновременно.
Подобно имени модуля прикладной программы, имя модуля библиотеки должно соответствовать имени выполняемого файла. Например, библиотека MYLIB.DLL имеет имя модуля MYLIB. Оператор имеет следующий синтаксис:
LIBRARY имя_библиотеки [INITGLOGAL INITINSTANCE]
где "имя_библиотеки" задает строку ASCII, которая определяет имя модуля библиотеки. Если вы не указываете имя, то TLINK использует имя исходного файла без расширения. Если файл определения модуля не содержит операторов NAME или LIBRARY, то TLINK подразумевает оператор NAME без параметра имени библиотеки.
INITGLOBAL означает, что подпрограмма инициализации модуля вызывается только при первой загрузки библиотечного модуля в память. INITINSTANCE означает, что подпрограмма инициализации модуля вызывается каждый раз, когда новый процесс использует библиотеку.
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 имя_сегмента [CLASS 'имя_класса'] [мин_распр] [SHARED NONSHARED] [PRELOAD LOADONCALL]
где имя_сегмента задает символьную строку, именующую новый сегмент. Это может быть любое имя, включая стандартные имена сегментов _TEXT и _DATA, представляющее стандартные сегменты кода и данных.
Поле "имя_класса" является необязательным ключевым словом, задающим имя класса для указанного сегмента. Если не задано имя класса, то TLINK использует стандартное имя класса CODE.
Поле "мин_распр" является необязательным целым значением, задающим минимальный размер распределения для сегмента. Обычно TLINK это значение игнорирует.
SHARED (задается по умолчанию для 16-разрядных DLL) означает, что одна копия сегмента совместно используется процессами. NONSHARED (задается по умолчанию для программ и 32-разрядных DLL) означает, что каждого процесса требуется своя копия сегмента.
PRELOAD означает, что сегмент загружается сразу же; LOADONCALL означает, что сегмент загружается, когда к нему происходит обращение или осуществляется доступ (в TLINK32 игнорируется). Компилятор ресурсов может переопределить параметр LOADONCALL и загружать сегменты предварительно.
Оператор STACKSIZE определяет число байт, требуемых для локального стека прикладной программы. Прикладная программа использует локальный стек всякий раз, когда делает вызов функции. Для библиотек DLL STACKSIZE использовать нельзя. Оператор имеет синтаксис:
STACKSIZE байтыгде "байты" является целым значением, задающим размер стека в байтах.
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 С++ входят следующие инструментальные средства для работы с ресурсами:
Большинство программ Windows легко использовать, так как они обеспечивают стандартный интерфейс с пользователем. Например, большинство программ Windows, позволяющие вам реализовать команды программы и изменять курсоры, что позволяет указателю "мыши" представлять большой набор инструментальных средств, таких как стрелки или кисти.
Меню и курсоры представляют два примера ресурсов программ Windows. Ресурсы - это данные, записываемые в выполняемый файл программы (.EXE) отдельно от обычных ее данных. Ресурсы определяются и задаются вне кода программы, а затем добавляются к скомпилированному коду программы для создания выполняемого файла программы.
Ресурсы определяются как внешние для вашего программного кода данные, а затем они подключаются к выполняемому файлу в процессе компоновки. Приложение вызывает ресурсы в память только при необходимости, что минимизирует использование памяти.
Чаще всего создавать и использовать вы будете следующие ресурсы:
Файлы сценариев ресурсов - это текстовые файлы, которые описывают конкретный ресурс приложения. Создать ресурсы вы можете с помощью редактора ресурсов или компилятора ресурсов. В большинстве случаев проще всего использовать редактор ресурсов и визуально создать ресурсы. Однако иногда удобно использовать для компиляции файлов манускрипта, которые встречаются в книгах или журналах, компилятор ресурсов.
Независимо от того, какой подход вы используете, с помощью RC или BRCC обычно создается файл ресурса (.RES) для каждой прикладной программы. Данный файл ресурсов содержит двоичную информацию для всех меню, диалогов, растровых образов и других ресурсов, используемых в прикладной программе.
Двоичный файл ресурсов, добавляемый к вашей прикладной программе (.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, которые используются в тексте ресурса в сочетании с условными директивами препроцессора для управления компиляцией.
Назад | Содержание | Вперед