Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теллес М. - Borland C++ Builder. Библиотека программиста - 1998

.pdf
Скачиваний:
764
Добавлен:
13.08.2013
Размер:
4.35 Mб
Скачать

Borland C++ Builder (+CD). Библиотека программиста 191

то не работает, хотя, вроде бы, присутствует в коде. Если, к примеру, у вас два определения одного и того же макроса (#define) находятся где-то среди многочисленных заголовочных файлов вашего приложения, то вы сможете найти их с помощью препроцессора. Если вы удалите кусок кода командой препроцессора #ifdef, то точно так же сможете понять, что происходит, посмотрев на то, что вам выдаст препроцессор.

Так как размер выходного файла препроцессора весьма велик, его стоит использовать только по сугубой необходимости. Но в любом случае приятно осознавать, что такая возможность есть.

Что такое Grep?

Одна из самых полезных вспомогательных программ в поставке Borland CBuilder — GREP.EXE. Grep — это «Generalized Regular Expression Parser» (основная программа разбора регулярных выражений). Программа grep была стандартной в системе Unix в течение многих лет, а затем была переписана для DOS и Windows. Проще говоря, grep — инструмент поиска, она умеет просматривать текстовые (и не только текстовые) файлы и искать в них строки, подходящие под заданный образец. Основные альтернативы утилите grep — программа Norton Text Search или команда Find в Windows Explorer. Ни одна из них, однако, не сравнится с grep мощью и гибкостью.

Для использования grep вам нужны две вещи: строка поиска и маска файлов, в которых ее надо искать. Grep умеет искать файлы, содержащие подходящие строки, в каталоге, в каталоге со всеми подкаталогами, по всему диску. Она поразительно быстра и точна, и фактически единственное, за что вы можете не любить эту программу, — ее уродливое название!

В табл. 8.3 приведены основные аргументы команды grep.

Таблица 8.3 Параметры команды grep

-r Использовать разбор регулярных выражений

-c Вместо распечатки имен найденных файлов выдавать их количество -v Показывать все строки, НЕ подходящие под заданную строку,

вместо подходящих

-d Искать в подкаталогах

-l Отображать только имена файлов, содержащих подходящие строки -n Отображать номера строк, в которых находится подходящий текст -I Результат поиска не зависит от регистра символов

-z Работа в режиме с подробными сообщениями (verbose mode)

Использование Grep для поиска файлов

Чтобы грамотно использовать grep, вам нужно кое-что знать о разборе регулярных выражений. Как новичку, вам достаточно знать лишь несколько команд:

. (точка) указывает на любой символ в строке, так что H.t будет подходить под следующие строки:

·Hot

·Hat

·Hut

·Hit

^ («крышечка») будет подходить только под символы, встречающиеся в начале строки. Поэтому, если у вас есть следующие строки текста:

This is a test

Why is This happening?

Borland C++ Builder (+CD). Библиотека программиста 192

There is This There is That

и вы будете искать ^This, то будет найдена только первая строка. Звездочка (*) и плюс (+) используются для нескольких символов. Например, A* подходит под ноль или более символов A в строке; поэтому все следующие строки соответству ют этому выражению:

AAA

AA

A

B

Последняя строка подходит, так как она содержит 0 символов A. Звездочка является очень мощной командой, которую надо использовать осторожно. При неосторожном использовании она вам выдаст гораздо больше «совпавших» строк, чем вам бы хотелось.

Плюс, с другой стороны, подходит только под один и более символ в строке, так что поиск по этому списку строк на текст A+ возвратит все, кроме последней строки, в которой нет ни одного символа A.

Если вы хотите найти несколько символов, используйте команды [ ]. Например, если задать образец [aeiou], то вы найдете все строки, содержащие гласные (английские). Если же, наоборот, задать [^aeiou], то вы получите все строки, не содержащие гласных.

Давайте посмотрим на пару примеров использования команды grep для поиска файла или нескольких файлов.

Для начала рассмотрим простой поиск. Все, что я хочу, — это знать, на какой строке в файле «fred.txt» находится слово «attack». Тогда я бы набрал следующую команду:

grep -n attack fred.txt

Эта команда вернет мне все строки со словом «attack» вместе с номером этой строки в файле «fred.txt». Теперь давайте рассмотрим поиск всех вхождений слова «main» в исходных файлах (.cpp) в каталоге проектов CBuilder. Для поиска этой группы файлов я бы использовал команду

grep -d main *.cpp

Эта команда выведет все строки, содержащие «main» в файлах с расширением .cpp в данном каталоге или любом его подкаталоге (вспомните, что ключ -d заставляет делать рекурсивный поиск по подкаталогам). И наконец, давайте найдем все функции, возвращающие целое значение, в текущем каталоге. Как это сделать? Очень просто. Функции обычно описываются в начале строки. Первым в строке вы найдете именно тип результата, возвращаемого функцией. Так что мы попросим программу grep искать все строки, в которых в начале стоит слово «int». Вот команда, которую нужно использовать:

grep ^int *.cpp

Если вы запустите ее в одном из каталогов с вашими исходными файлами, то, возможно, увидите, что эта программа найдет все функции, возвращающие целое. Хотя, конечно, grep — не идеал, но это поразительно быстрая и очень маленькая программа. Она настолько близка к идеалу, насколько это может компьютерная программа.

Borland C++ Builder (+CD). Библиотека программиста 193

Роемся в библиотеке

Следующая вспомогательная программа, которой мы хотим заняться, — команда tlib. Как мы отмечали выше, команду tlib можно использовать для просмотра содержимо го библиотеки и создания файла с листингом всех экспортируемых функций в этой библиотеке. Однако кроме этого простого задания программа tlib умеет также создавать новые библиотеки, добавлять модули в библиотеку и удалять модули из библиотеки.

Что именно называется библиотекой? Библиотека это набор модулей, называемых объектными файлами. Каждый раз, когда вы компилируете исходный файл на C++ (файл .cpp) в CBuilder, вы получаете объектный файл (.obj). Эти файлы можно собирать вместе в библиотечный файл (.lib) для использования их в других программах. Обычно вы будете помещать в библиотеки именно то, что вам нужно для использования в других программах. Примерами могут служить функции, формы и другие модули в CBuilder.

В табл. 8.4 перечислены доступные параметры команды tlib в CBuilder.

Таблица 8.4. Доступные параметры команды tlib

+<fileName> Добавляет объектный файл <fileName> в библиотеку -<fileName> Удаляет объектный файл <fileName> из библиотеки

*<fileName> Извлекает объектный файл <fileName> из библиотеки и помещает его в файл .obj, не удаляя его из библиотеки

-+<fileName> Заменяет объектный файл <fileName> в библиотеке

+=<fileName> То же, что и -+

/C Создает библиотеку с учетом регистра символов /E Создает расширенную библиотеку

/P<SIZE> Устанавливает размер страницы в библиотеке в <SIZE>

Использование команды tlib очень просто. Для добавления файла, например FOO.OBJ, в какую- нибудь библиотеку (например, FOO.LIB), вам нужно набрать команду:

TLIB FOO.LIB +FOO.OBJ

Точно так же для удаления файла FOO.OBJ из библиотеки FOO.LIB вы используете такую команду:

TLIB FOO.LIB -FOO.OBJ

И наконец, для получения файла листинга библиотеки просто добавьте имя файла листинга в конец командной строки, например, так:

TLIB FOO.LIB -FOO.OBJ, FOO.LST

Эта команда создаст библиотечный файл FOO.LIB, если такого еще нет, и удалит из этой библиотеки файл FOO.OBJ, если он есть (tlib предупредит вас, если вы попытаетесь удалить несуществующий объектный файл). После этого она создаст листинг всех внешних (экспортируемых) имен в библиотеке FOO.LIB и поместит эту информацию в файл FOO.LST. Вот и все, что можно сказать о программе tlib.

Программа tdump

Программа tdump — еще одна утилита CBuilder, которую можно применять разными способами к

Borland C++ Builder (+CD). Библиотека программиста 194

файлам вашей системы. В основном tdump позволяет вам посмотреть структуру файла, разбив его на компоненты. В применении к исполняемым файлам tdump может показать вам список модулей экспортируемых идентифика торов и, что самое важное, импортируемых идентификаторов этого исполняемого файла.

Также программа tdump может работать как обычная программа дампа файлов, то есть представления их в шестнадцатеричном виде. Если вы запустите ее на обычном двоичном файле, то можете посмотреть на шестнадцатеричное представление файла, что полезно при отладке для выяснения, почему ваш файл не хранит то, что должен, или почему файл базы данных отказывается открываться.

Короче говоря, tdump — инструмент программиста, дающий доступ к внутренней структуре файла. Учитывая всю сложность программ под Windows 95 и NT, в наши дни такая программа ценится на вес золота.

В табл. 8.5 приведены основные параметры программы tdump, которые вы можете задавать в командной строке.

Таблица 8.5. Основные параметры программы tdump

-a Выводить результат в виде ASCII. Это отображает все ASCII символы в файле. Очень

полезно для поиска строк в исполняемом файле

-a7 Как и -a, но отображает только вторую часть ASCII-таблицы

-b# Начать отображение со смещением в # байт во входном файле. Полезен, когда вам нужно посмотреть что-нибудь в середине или в конце файла

-e Обрабатывает файл как исполняемый, независимо от его расширения

-el Не отображать номера строк в выводе. По умолчанию номера строк присутствуют в выводе -h Шестнадцатеричный вывод. Для типов файлов, которые tdump «понимает» (например, EXE), вывод представляет собой обычный листинг, состоящий из записей

-m Запретить распознавание преобразованных имен C++

-oc Проверять целостность записей в OBJ-файле. В основном необходим для определения, правильны ли записи в OBJ-файле

-xID Не отображать отладочные записи для типа ID -r Сделать дамп избранных мест в записях

-R Для файлов PE (portable executable) сделать дамп таблицы перемещаемых входов

(relocatable entries)

-v Режим с подробными сообщениями

-o Форсирует программу tdump для обработки данного файла как объектного (OBJ)

Синтаксис программы tdump представлен следующей строкой:

tdump [options] InputFile [Listing]

где options или пусто, или содержит параметры из табл. 8.5, InputFile имя двоичного файла, содержимое которого вы хотите посмотреть, а Listing имя выходного файла листинга. Если вы не зададите имя файла листинга, то программа выдаст результаты на консоль.

Как видите, программа tdump может дать вам немало информации о файле. Давайте рассмотрим два простых примера использования программы.

Во-первых, возьмите исполняемый файл в вашей системе и запустите на нем tdump. Это может быть любой файл в каталоге Windows с расширением EXE.

Borland C++ Builder (+CD). Библиотека программиста 195

В данном примере я выбрал Exporer.EXE для программы tdump. Когда вы запустите tdump, то получите примерно следующее: Turbo Dump Version 5.0.13.1 Copyright (c) 1988, 1997 Borland International

Display of File EXPLORER.EXE Old executable header

DOS File Size 31e00h (204288. )

Load Image Size 450h ( 1104. ) Relocation Table entry count 0000h ( 0. ) Relocation Table address 0040h ( 64. )

Size of header record (in paragraphs)0004h ( 4. ) Minimum Memory requirement (in paragraphs)0000h ( 0. )

Maximum Memory requirement (in paragraphs)FFFFh ( 65535. ) File load checksum 0000h ( 0. )

Overlay number 0000h ( 0. )

Initial Stack Segment (SS:SP) 0000:00B8

Program Entry Point (CS:IP) 0000:0000 Portable Executable (PE) File

Header base: 00000080 CPU type 80386

Flags 10E [ executable backwards 32bit ] DLL flags 0000 [ ]

Linker Version 2.32 Time stamp 2FF35DC9 O/S Version 1.0

User Version 0.0 Subsystem Version 4.0

Subsystem 002 [ Windows GUI ] Object count 00000005 Symbols offset 00000000 Symbols count 00000000 Optional header size 00E0 Magic # 10B

Code size 00021800 Init Data size 00010200

Uninit Data size 00000000 Entry RVA 0000DEF1 Image base 00400000 Code base 00001000 Data base 00023000

Object/File align 00001000/00000200 Reserved 00000000

Image size 00035000 Header size 00000400 Checksum 00034598

Stack reserve/commit 00100000/00001000 Heap reserve/commit 00400000/00001000 Number interesting RVAs 00000010

Вся эта информация говорит вам что-либо о файле: размер кода, размер данных, размер образа загрузчика. Более интересные вещи, однако, находятся в этой секции:

Imports from USER32.dll

DispatchMessageA(hint = 0086)

Borland C++ Builder (+CD). Библиотека программиста 196

RedrawWindow(hint = 0194)

RegisterWindowMessageA(hint = 01a0)

SetScrollPos(hint = 01de)

ScrollWindowEx(hint = 01ac)

RegisterClassExA(hint = 0196)

GetClassInfoExA(hint = 00c7)

SendNotifyMessageA(hint = 01b5)

IsWindowEnabled(hint = 0151)

UnionRect(hint = 0212)

GetMenu(hint = 00f3)

SetWindowTextA(hint = 01ee)

Записи в секции «Imports from» показывают вам, какие динамические библиотеки (DLL) этот модуль требует для запуска. Поэтому вы с помощью tdump можете узнать, какие DLL должны присутствовать в системе, чтобы данная программа работала в ней. Более интересная идея посмотреть, откуда у программы определенная функциональ ность, взглянув на набор импортируемых ею функций. И наконец, вы можете узнать кое-что о Windows API, посмотрев на списки импорта из таких системных динамичес ких библиотек (DLL) Windows, как USER32 и GDI32. Вы сможете найти функции, про которые вы никогда не слышали, зарытые глубоко в недрах одной из DLL и при этом экспортируемые.

Второй способ использования tdump — генерация шестнадцатеричного дампа программы. Вместо списка функций программы Explorer мы можем взглянуть на некоторые строки текста, похороненные внутри файла, используя команду:

tdump -a explorer.exe

Это приведет примерно к такому выводу: C:\WINDOWS>tdump -a explorer.exe

Turbo Dump Version 5.0.13.1 Copyright (c) 1988, 1997 Borland International

Display of File EXPLORER.EXE

 

 

 

000000: MZ..............

ё.......

@...................................

 

 

Ђ...

000040: ..є....

Н!ё.LН!This program cannot be run in DOS mode....$.......

000080: PE..L...

§¤'0...............

2.....................

 

0....

@.........

0000C0: .................

 

P......

Р.................

@.....................

 

 

000100: .@..м$...

p..l«...................

...

*..........................

 

 

000140: .........................................................

 

 

 

 

text

...

000180: ............................

 

 

..`.data........

0..................

 

 

0001C0: ....

@..А.idata..м$...@...&...

..............

@..@.rsrc....°...p..

000200: .¬...

F..............

 

@..@.reloc..d.... ...

0...т..............

@..B

000240: ................................................................

 

 

 

 

 

 

000280: ................................................................

0002C0: ................................................................

000300: ................................................................

То, что вы видите, — это заголовок исполняемого файла, «заглушка», которая загружается при запуске файла. Здесь мы видим знакомое сообщение «This program cannot be run in DOS mode» («программа не может быть запущена в режиме DOS»), которое появляется, когда вы пытаетесь запустить программу explorer вне среды Windows. Если посмотреть весь файл, то можно увидеть сообщения об ошибках для различных случаев, а также имена файлов и каталогов по умолчанию и т. д.

Программа tdump в основном используется для просмотра информации об импорте и экспорте

Borland C++ Builder (+CD). Библиотека программиста 197

программы, но, как мы видели, ее можно использовать и для много чего другого.

Что такое Trigraph?

Если вы просмотрите каталог bin в дереве установки CBuilder, то найдете там программу trigraph. Для большинства людей программа trigraph не нужна и может быть проигнорирована. Однако для некоторых владельцев европейских клавиатур trigraph может быть необходима. Некоторые клавиатуры в отдельных странах не имеют всех «стандарт ных» символов, необходимых для программирования на C++. Например, нужны такие символы, как «диез» (#), квадратные скобки ([ и ]), обратная черта (\). Комитет ANSI C++ догадался, что эти символы не всегда доступны, и придумал способ эмулировать их на всех клавиатурах. Например, символ # можно представить в виде трех символов, ??=. Если у вас был исходный файл со следующим кодом:

??=include <stdio.h>

то стандартный компилятор C++ преобразует эту строчку в стандартный код на C++:

#include <stdio.h>

К сожалению, обработка такого кода сильно затормаживает компилятор, так что Borland предоставила отдельный продукт программу trigraph, которая выполняет такие преобразования. Например, мы создаем файл tritest.cpp, содержащий следующий код:

??=include <stdio.h> ??=include <stdlib.h> int array??(20??);

int main() ??< return 0; ??>

Тогда, запустив команду trigraph tritest.cpp, этот файл будет скопирован в tritest.bak, а на его месте, tritest.cpp, будет новый файл со следующим кодом:

#include <stdio.h> #include <stdlib.h> int array[20];

int main()

{

return 0;

}

Этот файл будет компилироваться стандартным C++ компилятором. Я не могу себе представить ситуации, когда кто-либо будет использовать trigraph кроме как в абсолютно безвыходной ситуации, но тем не менее, если у вас сломаются клавиши # или {}, то вам не обязательно сразу идти и топиться.

Обзор BDE

Следующая часть нашего обзора инструментов относится к BDE, то есть Borland Database Engine (универсальная машина баз данных), которая представляет собой интерфейс со многими стандартными базами данных. BDE умеет напрямую работать с базами данных dBase и Paradox, а также Interbase. Кроме того, в некоторых версиях поставки CBuilder (Professional и выше) BDE

Borland C++ Builder (+CD). Библиотека программиста 198

может использоваться также для работы с базами данных ODBC.

Инсталляция BDE происходит при установке CBuilder, однако если вы почему-то не поставили его тогда, то можете это сделать в любой момент (из каталога BDE на компакт-диске с системой

CBuilder).

Если ваша программа использует BDE и вам нужно ее устанавливать на компьютер пользователя, то я настоятельно рекомендую вам использовать программу InstallShield, которая поставляется вместе с версией CBuilder Professional Edition (и выше). Это просто чудо, а не программа. Все, что вам нужно сделать, — это указать имя исполняемого файла вашей программы, а затем выбрать файлы, которые вы хотите поставлять вместе с вашим приложением. InstallShield сделает все остальное, включая установку всех разрешенных к распространению файлов систем BDE и IDAPI, которые дают вашей программе полный доступ к базам данных.

Конфигуратор BDE

Главное, что дает вам BDE, — независимость вашего приложения от базы данных. Вашей программе не обязательно знать, где находится база данных или на какой машине она живет, чтобы ее использовать. Вместо этого вы работаете с понятием псевдонима (alias).

В основном вы будете работать через псевдонимы (aliases) в вашем коде, обрабатывающем базы данных в CBuilder, не заботясь о типе и местонахождении файлов таблиц баз данных. Ваш код будет работать одинаково, независимо от того, работаете вы с базой данных Oracle, расположенной где-то в локальной корпоративной сети, или же с базой данных Paradox, расположенной на локальном жестком диске. BDE заботится обо всех соединениях и преобразованиях внутри сети. Вот почему вам стоит работать с BDE.

В системе BDE есть два инструмента, про которые стоит коротко рассказать: программа конфигурирования BDE (BDE Configuration) и проводник баз данных (Database Explorer),

поставляемый с CBuilder. Дадим краткое описание каждой программы, чтобы познакомить вас с их возможностями.

Программа конфигурирования BDE позволяет вам определять псевдонимы (aliases), изменять их свойства и работать с местами расположения и разрешения ми доступа к базам данных в системе. Как только вы определили псевдоним для базы данных в программе BDE Configuration, вы можете использовать этот псевдоним напрямую во всех путях к базам данных в Object Inspector в CBuilder.

На рис. 8.1 показана первая страница программы BDE Configuration, в которой вы задаете псевдонимы для баз данных.

На первой странице экрана конфигурации вы можете определить выбранный вами драйвер. Это называется активной конфигурацией. Как только вы выбрали базы данных для работы, можете переместиться на вторую закладку в окне, то есть на страницу Alias (псевдоним). Здесь вы можете определить новый псевдоним для вашей базы данных. Можете считать, что псевдоним это имя базы данных. CBuilder работает с псевдонимом как с самой базой. В зависимости от типа базы данных, с которым вы работаете, у вас может быть несколько таблиц, связанных с псевдонимом.

Закладки System, Date, Time и Number экрана конфигурации представляют информацию о том, как эти типы данных (соответственно системные типы, дата, время и числа) отображаются и обрабатываются системой. Например, на вкладке Number вы увидите отображенные разделитель тысяч, десятичную точку и количество десятичных цифр после точки. Если число в базе данных

Borland C++ Builder (+CD). Библиотека программиста 199

представлено как 1000, то по умолчанию оно будет отображаться как 1,000.00.

Рис. 8.1. Программа конфигурирования BDE

Обычно вы просто используете программу BDE Configuration для доступа к базам данных, которые вы устанавливаете в системе. Однако, как вы видели в прошлой главе, посвященной базам данных, вы также можете использовать ее для определения интерфейсов ODBC (если у вас версия CBuilder Professional Edition и выше) и соединения с базами данных всех видов, например

Oracle или Access.

Программа Database Desktop

Снова и снова вам придется тестировать ваш код на тестовой базе данных, в то время как счастливые дизайнеры работают над «формальным» оформлением. Database Desktop (рабочий стол баз данных) — наиболее удобный инструмент для разработки новых баз данных, тестирования запросов, написания выражений SQL и просмотра данных, вводимых в систему.

Утилиту Database Desktop можно запустить из меню CBuilder. Основной экран программы показан на рис. 8.2.

Чаще всего вы будете использовать Database Desktop для создания новых баз данных и просмотра данных в уже существующих. Вы, скорее всего, будете использовать следующие команды:

File|New|Table — для создания базы данных любого типа, с которым программа умеет работать.

File|Open|Table — позволяет просматривать данные.

Кроме того, для создания нового запроса используйте команды меню File|New|QBE query или File|New|SQL file для прямого запроса в базе данных (выбирая поля) или определения команд SQL для последующего использования в CBuilder.

Borland C++ Builder (+CD). Библиотека программиста 200

Рис. 8.2. Утилита Database Desktop

Про эту программу мало что можно сказать; все описано в справочной системе. Научиться с ней работать можно, немного в ней поработав. Она хорошо составлена и проста в обращении.

Database Explorer (проводник баз данных)

Последняя утилита, на которую мы обратим внимание в этой главе, — Database Explorer. Эта программа (рис. 8.3) позволяет легко и быстро просматривать базы данных ODBC, Paradox и dBase. Она позволяет просмотреть структуру базы, включая все имена таблиц, индексы, поля, поля проверки целостности (validity checks), поля проверки перекрестных ссылок (referential integrity checks) и многое, многое другое.

Я настоятельно рекомендую вам как следует освоить Database Explorer. Это удивительное средство, которое дает вам гораздо больше возможностей управления базой данных, чем многие «навороченные» утилиты, поставляемые с основными системами управления баз данных.

Рис. 8.3. Утилита Database Explorer

Соседние файлы в предмете Программирование на C++