Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Утилита 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, которые используются в тексте ресурса в сочетании с условными директивами препроцессора для управления компиляцией.

Назад | Содержание | Вперед

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...