Implib как пользоваться
Перейти к содержимому

Implib как пользоваться

  • автор:

Implib как пользоваться

RLINK комбинирует файл .RES с файлом .EXE для создания нового выполняемого файла Windows. На входе RLINK задаются один или несколько объектных файлов, а на выходе создается один выполняемый файл Windows. RLINK компонует ресурсы, корректируя строковые таблицы и таблицы сообщений и связывая эти скомпонованные ресурсы с выполняемым файлом. Командная строка имеет следующий синтаксис:

Командный процессор ресурсов: BRC.EXE

Borland Resource Compiler (BRC) — это оболочка компилятора ресурсов. В зависимости от синтаксиса командной строки, она вызывает BRCC или RLINK, либо оба этих продукта. Командная строка BRC имеет следующий синтаксис:

Параметры перечислены в следующей таблице:

Использование библиотек

  • Утилита IMPLIB создает библиотеки импорта, а IMPDEF — файлы определения модуля (.DEF). Библиотеки импорта и файлы определения модулей задают для компоновщика информацию об импортируемых из библиотек DLL функциях.
  • Утилита TLIB управляет библиотеками отдельных файлов .OBJ. Библиотека — это удобный инструмент для работы с набором объектных модулей.

Утилита IMPLIB: библиотекарь импорта

Утилита IMPLIB создает библиотеку импорта, которая может замещать часть или всю секции IMPORTS файла определения модуля для прикладной программы Windows. IDE использует IMPLIB как транслятор для целевого файла DLL. Когда вы добавляете DLL в качестве цели, администратор проектов компилирует и компонует те файлы, от которых зависит DLL, а затем запускает IMPLIB для создания файла .LIB. Вы можете также запустить IMPLIB из IDE.

Библиотеки импорта содержат записи. Каждая запись содержит имя DLL и определяет, где в DLL находятся импортируемые функции. Эти записи связываются с приложением с помощью компоновщика и обеспечивают для Windows информацию, нужную для выполнения вызова функций. Библиотека импорта может указываться в секции IMPORTS файла определения модуля.

Если вы создали приложение Windows, то уже использовали по крайней мере одну библиотеку импорта, IMPORT.LIB, библиотеку для стандартных DLL Windows (она компонуется автоматически). Библиотека импорта перечисляет некоторые или все экспортируемые функции для одной или нескольких DLL. Чтобы создать библиотеку импорта для DLL, наберите:

где «параметры» — это необязательный список из одного или более параметров IMPLIB, «имя_библиотеки» — это имя новой библиотеки импорта, «файлы_определ» — это список из одного или более файлов определения модуля для одной или более DLL, а DLL — список существующих DLL. Требуется задать по крайней мере одну DLL или файл определения модуля.

Утилита IMPDEF: администратор файлов определения модуля

Утилита IMPDEF используется с IMPLIB для того, чтобы дать возможность настроить библиотеку импорта для необходимой комплектации заданной прикладной программы. Библиотека импорта используется для предоставления доступа к функциям DLL.

Синтаксис вызова утилиты IMPDEF:

При этом из файла «имя_источника.DLL» создается файл определения модуля с именем «имя_приемника.DEF». Файл определения модуля будет выглядеть следующим образом:

где «имя_файла» является именем корневого файла DLL, ‘Описание’ является значением утверждения DESCRIPTON, если DLL была предварительно скомпонована с файлом определения модуля, который включает утверждение DESCRIPTION, «имя_экспортируемой_функции» являются именами экспортных функций, а «номера» являются порядковыми значениями (целыми) этих функций.

Классы в DLL

Данная утилита удобна для DLL, использующей классы C++, по двум соображениям. Во-первых, если вы используете ключевое слово _exрort при определении класса, экспортируются все невстроенные функции-элементы и элементы статических данных для этого класса. Удобнее создать файл определения модуля с помощью IMPDEF, так как в нем будут перечислены все экспортируемые функции, включая функции-элементы и элементы статических данных.

Поскольку имена данных функций являются «скорректированными», процесс перечисления всех имен функций в секции EXPORTS файла определения модуля для создания библиотеки импорта из файла определения модуля является очень утомительным. Если для создания файла определения модуля вы используете утилиту IMPDEF, она будет включать порядковое значение для каждой экспортируемой функции, так же как и исходное имя в комментариях, следующих за точкой входа функции, если экспортируемое имя является «скорректированным». Так, например, файл определения модуля, созданный утилитой IMPDEF для DLL, которая использует классы C++, будет выглядеть примерно следующим образом:

где «имя_файла» является корневым именем DLL, ‘Описание’ является значением утверждения DESCRIPTION, если DLL была предварительно скомпонована с файлом определения модулей, который включал ут- верждение DESCRIPTION, «скоррект_имя_экпорт_функции» представляет собой скорректированное имя, «номера» являются порядковыми значе- ниями (целыми) функций, а «имя_экпорт_функции» задает исходное имя функции.

Функции в DLL

Утилита IMPDEF создает редактируемый исходный файл, который перечисляет все экспортные функции в DLL. Вы можете отредактировать этот файл .DEF так, чтобы он содержал только те функции, которые вы хотите сделать доступными для нужной прикладной программы, а затем выполнить IMPLIB для отредактированного файла .DEF. В результате получается библиотека импорта, которая содержит информацию импорта для заданного подмножества экспортируемых функций DLL.

Например, пусть вы определяете DLL, которая предоставляет функции для использования различными прикладными программами. Каждая экспортируемая функция в DLL определяется с помощью оператора _exрort. Теперь, если все прикладные программы используют все экспортируемые функции DLL, вы можете просто использовать IMPLIB для создания одной библиотеки импорта для DLL и поставлять эту библиотеку импорта с DLL. Библиотека импорта может быть скомпонована с любыми прикладными программами, исключая таким образом необходимость перечисления для каждой прикладной программы каждой используемой ей функции DLL в секции IMPORT файла определения модуля.

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

Для создания библиотеки импорта, которая удовлетворяет этим условиям, выполните IMPDEF для откомпилированной и скомпонованной DLL. Утилита IMPDEF создаст файл определения модуля, который содержит в секции EXPORT перечисление всех экспортируемых функций DLL. Вы можете редактировать этот файл определения модуля, удаляя компоненты секции EXPORTS для тех функций, которые вы не хотите включать в библиотеку импорта. После того, как вы удалите ненужные экспортируемые функции, выполните утилиту IMPLIB для файла определения модуля. Результатом будет библиотека импорта, которая содержит информацию импорта только для экспортных функций, перечисленных в секции EXPORTS файла определения модуля.

Утилита TLIB: турбо библиотекарь

  • создать новую библиотеку из совокупности объектных модулей;
  • добавить объектные модули или другие библиотеки к какой-либо существующей библиотеке;
  • удалить объектные модули из существующей библиотеки;
  • заменить одни объектные модули в существующей библиотеке на другие;
  • извлечь объектные модули из существующей библиотеки;
  • отобразить содержимое новой или существующей библиотеки.

Когда утилита TLIB осуществляет модификацию существующей библиотеки, она всегда создает копию оригинальной библиотеки с расширением .BAK. При модификации существующей библиотеки TLIB всегда создает копию исходной библиотеки с расширением .BAK. Это делается для вашего удобства.

Утилита TLIB может также создавать (и включать в файл библиотеки) расширенный словарь, который может использоваться для ускорения процесса компоновки. Хотя утилита TLIB не обязательна для создания выполняемых программ при работе с Borland C++, она представляет собой полезный инструмент повышения производительности труда программиста. Вы обнаружите, что утилита TLIB незаменима при создании больших проектов. Если вы работаете с библиотеками объектных модулей, созданных другими лицами, то при необходимости вы можете использовать TLIB для их сопровождения.

Почему следует использовать библиотеки объектных модулей

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

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

Командная строка утилиты TLIB

Командная строка утилиты TLIB имеет общий вид, приведенный ниже, где заключенные в квадратные скобки элементы являются необязательными:

Чтобы получить информацию об использовании TLIB, просто наберите команду TLIB и нажмите клавишу Enter.

В IDE вы можете задать библиотеку в качестве целевого файла проекта. С помощью TargetExpert выберите для целевого типа Static Library. TLIB — это используемый по умолчанию для библиотечного файла транслятор. Он использует параметры, заданные в диалоговом окне Project Options секции Librarian (выберите в основном меню Options Project).

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

При работе с большим числом операций или при многократном повторении определенного числа операций удобно пользоваться файлами подсказки. Файл подсказки представляет собой текстовый файл в обычном формате ASCII (который может быть создан с помощью редактора системы Borland C++), содержащий все команды утилиты TLIB или какую-то их часть. С помощью файлов подсказки вы можете создавать команды утилиты TLIB, размер которых превышает размер командной строки DOS (128 символов).

  • Файл подсказки может состоять из нескольких строк текста; чтобы показать, что за данной строкой следует еще одна, в конце текущей строки необходимо набить символ «логического И» (&).
  • В файл подсказки не нужно заносить всю команду TLIB; этот файл может содержать часть командной строки утилиты TLIB, а остальная часть может задаваться в командной строке.
  • В одной командной строке утилиты TLIB можно использовать несколько файлов подсказки.

Создание расширенного словаря: параметр /E

Для ускорения процесса компоновки больших файлов библиотек (таких, как стандартная библиотека Cx.LIB), можно указать утилите TLIB, что нужно создать расширенный словарь и подсоединить его к файлу библиотеки. Данный словарь в крайне компактной форме содержит информацию, которая не вносится в стандартный словарь библиотеки. Эта информация позволяет компоновщику TLINK быстрее обрабатывать файлы библиотек, особенно в том случае, когда они находятся на гибком диске или на медленном жестком диске. Все библиотеки на ваших дистрибутивных дисках содержат расширенный словарь.

Для создания расширенного словаря модифицируемой библиотеки необходимо при добавлении, удалении или замене модулей в этой библиотеке задать параметр /E при вызове утилиты TLIB. Для создания расширенного словаря существующей библиотеки, которую вы не хотите модифицировать, нужно задать параметр /E и указать TLIB удаление из библиотеки несуществующего модуля. При этом утилита TLIB выдаст предупреждающее сообщение о том, что заданный модуль в библиотеке не найден, но наряду с этим создаст расширенный словарь заданной библиотеки. Например, введите следующую строку:

Если не использовать в командной строке TLIB параметр /e, то утилита TLIB будет игнорировать отладочную информацию в библиотеке, имеющей расширенный словарь.

Задание размера страницы: параметр /P

Каждый библиотечный файл в системе DOS содержит в себе словарь (располагающийся в конце .LIB файла, после объектных модулей). Для каждого модуля в библиотеке данный словарь содержит 16-битовый адрес этого конкретного модуля внутри файла .LIB; адрес задается в единицах, равных размеру страницы библиотеки (по умолчанию, этот размер равен 16 байтам).

Размер страницы библиотеки определяет максимальный совокупный размер всех объектных модулей в библиотеке — библиотека не может превышать 65536 страниц. Стандартный (и минимальный) размер страницы, равный 16 байтам, позволяет создавать библиотеки размером до 1 Мбайт (приблизительно). Для того, чтобы создать библиотеку большего размера, необходимо увеличить размер страницы с помощью параметра /P; размер страницы должен являться степенью двойки; он не может быть меньше 16 байт и не может превышать 32768 байт.

Все модули в библиотеке должны начинаться с границы страницы. Например, в библиотеке с размером страницы 32 (минимально возможный размер страницы который больше стандартного значения 16), в результате создания «зазоров» на каждом объектном модуле будет теряться в среднем 16 байт. Если вы пытаетесь создать библиотеку, которая слишком велика для заданного размера страницы, утилита TLIB выдаст сообщение об ошибке и предложит вам воспользоваться параметром /P, задав следующее, большее значение размера страницы.

Различимость регистра символов в идентификаторе: параметр /C

Когда вы добавляете к библиотеке какой-либо модуль, утилита TLIB корректирует словарь всех общедоступных идентификаторов, которые описаны в модулях библиотеки. Все идентификаторы в конкретной библиотеке должны быть различными. Если попытаться добавить к библиотеке какой-либо модуль, в котором содержится дублирующий идентификатор, то утилита TLIB выдаст сообщение, но модуль не добавит.

Обычно когда утилита TLIB проверяет библиотеку на наличие дублируемых идентификаторов, буквы верхнего и нижнего регистров обычно не различаются. Например, идентификаторы lookuр и LOOKUP будут восприниматься как дубликаты. Так как Си обрабатывает буквы верхнего и нижнего регистров как различным образом, для добавления в библиотеку модуля, содержащего идентификатор, отличающийся от другого, уже имеющегося в библиотеке идентификатора, только регистром букв, нужно пользоваться параметром /C. Параметр /C указывает утилите TLIB, что нужно считать допустимыми модули, в которых идентификаторы отличаются от уже имеющихся в библиотеке только регистром букв.

Если вы хотите использовать эту библиотеку с другими компоновщиками (или позволить другим лицам использовать эту библиотеку с другими компоновщиками), то во избежание «неприятностей», параметр /C использовать не рекомендуется.

Удаление записей-комментариев: параметр /O

Параметр /O указывает библиотекарю, что из библиотеки нужно удалить все записи комментария «Comment». Записи комментария применяются обычно для хранения информации, используемой отладчиком или другими инструментальными средствами, и не требуются для создания выполняемого файла. Использование данного параметра позволит уменьшить объем ваших библиотек (и создаваемых с их использованием программ).

Список операций

Список операций определяет, какие действия должна выполнять утилита TLIB. Он состоит из последовательности заданных одна за другой операций. Каждая операция состоит из одно- или двухсимвольного обозначения операции, за которым следует имя файла или имя модуля. Пробельные символы могут окружать либо обозначение операции, либо имя файла или модуля, но их нельзя использовать в середине двухсимвольного обозначения операции или внутри имени.

  1. Сначала выполняются все операции извлечения.
  2. Затем выполняются все операции удаления.
  3. И, наконец, выполняются все операции добавления.

Замена какого-либо модуля может быть произведена путем удаления его с последующим добавлением заменяющего модуля.

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

Утилита IMPLIB: библиотекарь импорта

имя DLL и определяет, где в DLL находятся импортируемые функции.

Эти записи связываются с приложением с помощью компоновщика и

обеспечивают для Windows информацию, нужную для выполнения вызова

функций. Библиотека импорта может указываться в секции IMPORTS

файла определения модуля.

Если вы создали приложение Windows, то уже использовали по

крайней мере одну библиотеку импорта, IMPORT.LIB, библиотеку для

стандартных DLL Windows (она компонуется автоматически). Библиотека импорта перечисляет некоторые или все экспортируемые функции

для одной или нескольких DLL. Чтобы создать библиотеку импорта

для DLL, наберите:

IMPLIB параметры имя_библиотеки [файлы_определ. DLL. ]

где «параметры» — это необязательный список из одного или более

параметров IMPLIB, «имя_библиотеки» — это имя новой библиотеки

импорта, «файлы_определ» — это список из одного или более файлов

определения модуля для одной или более DLL, а DLL — список существующих DLL. Требуется задать по крайней мере одну DLL или

файл определения модуля.

Параметр Описание -с Воспринимает идентификаторы с различием регистра

Fore kc .ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий

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

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

Итак , мы разобрались с первыми двумя этапами . Третий этап начинается после того , как пользователь что — то выбрал из каждой таблицы . Для воплощения добавьте по обработчику для события OnClick каждого списка . Следующий код добавьте в оба обработчика ( здесь показан только один , но они одинаковы ) или в общий обработчик для обоих списков :

void __fastcall TForm1::ListBox1Click(TObject *Sender)

if (ListBox1->ItemIndex != -1 && ListBox2->ItemIndex != -1) DoSQLProcess();

Теперь все , что нам осталось сделать , — это определить метод DoSQLProcess . Этот метод создает динамический запрос SQL (Structural Query Language, структури рованный язык запросов ) и связывает его с объектом TQuery , который мы используем для загрузки данных в сетку . Давайте сначала взглянем на код метода DoSQLProcess , а потом поговорим о том , как он работает :

int nList1Idx = ListBox1->ItemIndex; AnsiString s1 = ListBox1->Items->Strings[nList1Idx].c_str(); int nList2Idx = ListBox2->ItemIndex; AnsiString s2 = ListBox2->Items->Strings[nList2Idx].c_str(); AnsiString s = «SELECT * FROM \»»;

s += Table1->DatabaseName.c_str(); s += Table1->TableName.c_str();

s += Table2->DatabaseName.c_str(); s += Table2->TableName.c_str();

s += «\» as T2″; s += » WHERE «;

s += «T1.» + s1 + » = T2. » + s2; // Присваиваем строку SQL Query1->SQL->Add(s); Query1->Active = true;

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

Как это работает ?

Свойство SQL объекта TQuery представляет собой список строк , образующих команду SQL, которую мы хотим передать базе данных . Язык SQL как таковой не относится к предмету рассмотрения данной книги , но детали этого примера представляют для нас интерес . Сначала мы создаем строку , состоящую из стандартно го оператора SQL SELECT :

SELECT * from db1, db2

где db1 — это имя первой таблицы базы данных , а db2 — имя второй . Беда в том , что мы не используем таких простых обозначений , как db1 или db2. Вместо этого имена таблиц имеют вид диск :\ каталог \ имятаблицы .dbf . Это существенно усложняет работу с именами таблиц . Язык SQL максимально нагляден , поэтому мы заключаем имена баз данных в кавычки . Первая часть

оператора выглядит как

SELECT * from «d:\directory1\table1.dbf»,

что является обычным оператором SQL. Следующая часть оператора — предложение WHERE , которое выглядит примерно как db1.field = db2.field. Это предложение возвращает все записи , в которых поле в db1 идентично полю в db2. Проблема в том , что SQL сломается и умрет на утверждении типа :

Для того чтобы справиться с этой проблемой , мы используем оператор SQL, определяющий псевдонимы (alias statements, AS), который позволяет нам обращаться к таблице по более короткому имени . В нашем случае мы именуем обращение к первой таблице как t1, а ко второй — как t2. После этого мы можем обращаться к полям как t1.field и t2.field.

После того как строки SQL созданы , мы добавляем их в поле Strings объекта TQuery , а затем делаем запрос активным . Это повлечет за собой выбор заданных нами записей из таблиц и их загрузку в сетку . Все очень просто , не так ли ? Да , просто , но только если вы знаете , что и как сделать .

Использование источников ODBC с объектами баз данных CBuilder

Один из вопросов по базам данных , наиболее часто задаваемых в сети Internet, — это вопрос о том , как использовать базы данных ODBC с CBuilder. В вопросе речь идет , как правило , о базе данных Microsoft Access, но вся описываемая ниже процедура применима и ко всем остальным базам данных ODBC.

Для начала найдите и откройте ODBC Administrator, который обычно расположен в панели управления Windows 95 или Windows NT. Для того чтобы попасть туда , откройте панель управления (Start|Settings) и дважды щелкните на иконке ODBC в основном экране панели управления .

Находясь в ODBC Administrator ( администраторе ODBC), выберите кнопку Add ( добавить ). Вам будет предложен список типов баз данных в открывшемся окне диалога Add Data Source.

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

Выберите тип базы данных , которую хотите открыть . Для файлов Microsoft Access вам следует выбрать «Access data *.mdb».

Нажмите в этом окне кнопку OK, и откроется окно диалога , озаглавленное «ODBC Microsoft Access Setup». Введите имя , которое собираетесь использовать как источник базы данных в CBuilder. Например , введите имя CBuilderAccess .

Нажмите кнопку Select Database ( выбрать базу данных ) и перейдите к файлу базы данных , который собираетесь использовать с CBuilder. Нажмите кнопку OK, и имя базы данных появится в окне диалога Setup. Нажмите кнопку OK в окне Setup, а затем кнопку Close в окне диалога Add Data Source. Этим вы закроете ODBC Administrator.

Теперь откройте Borland Database Configuration Utility, которая поставляется с CBuilder. Вы найдете эту программу в подменю Borland меню Start в Windows 95. В основном окне

Configuration Utility нажмите кнопку New ODBC Driver. В поле ввода SQL Link Driver введите строку ODBC_ACCESS . Из списка ODBC Driver ( существующих драйверов ODBC) выберите «Microsoft Access Driver (*.mdb)». Установите имя источника данных по умолчанию CBuilderAccess, как вы делали в окне администратора ODBC.

Щелкните на вкладке Aliases ( псевдонимы ) внизу экрана конфигурации . Нажмите кнопку New Alias ( новый псевдоним ) и назовите новый псевдоним так , как вам нравится . Выберите тип баз данных ODBC_ACCESS .

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

Database для нового объекта TTable или TQuery .

Что мы узнали в этой главе ?

Это была весьма подробная глава , анализирующая внешние и внутренние аспекты программирования баз данных с использованием CBuilder и VCL. Как минимум , в этой главе вы должны были изучить следующие аспекты :

· просмотр структуры полей базы данных во время выполнения ;

· создание базы данных по вашему собственному или заданному пользовате лем критерию ;

· работа с компонентами , воспринимающими данные , для ускорения работы с базой данных ;

· соединение с ODBC- источником в CBuilder;

· работа с объектом TQuery для соединения с несколькими таблицами одновременно ;

· отфильтровка ненужных данных в базе ;

· просмотр данных в базе с использованием воспринимающей данные сетки .

Глава 8. Антракт : инструменты CBuilder

Утилиты командной строки

Работа с ресурсами

Просмотр содержимого библиотек

Интегрированная среда разработки более всего на виду в системе CBuilder, но кроме нее есть еще много составляющих . Большинство из инструментов , составляющих среду разработки , могут быть использованы отдельно от нее для выполнения более простых задач , и в этой главе мы их и

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

рассмотрим — компилятор , компоновщик и компилятор ресурсов . Мы также поговорим об использовании некоторых утилит , поставляемых с системой , — grep, tlib, IDEToMak и tdump. Должен вас предупредить , что большинство из инструментов системы CBuilder лучше всего работают , будучи запущенными из командной строки ( в окне MS-DOS), так что если вы не чувствуете себя уверенно в этом режиме , то при работе с некоторыми инструментами у вас возникнут проблемы .

Работа с компилятором из командной строки

Первым инструментом командной строки , который мы рассмотрим , станет компилятор bcc32.exe. Этот инструмент может быть использован для работы с небольшими тестовыми программами , которые вы захотите собрать воедино , служащими

Работа с компилятором из командной строки

для проверки небольших алгоритмов и написания простейших вспомогательных программ . Этот компилятор обладает большой мощью , но вряд ли вы будете собирать большие программы из командной строки . Для использования компилятора командной строки вам надо сначала создать исходный текст программы в каком — нибудь редакторе . После чего вы просто набираете в

где mysource.cpp — это имя исходного файла , который вы хотите скомпилировать . Компилятор автоматически оттранслирует исходный код и , если не произойдет ошибок при компиляции , соберет его в консольное приложение . Практически любой тип кода на C++ может быть скомпилирован таким образом , от небольшой прикладной программы до утилит Unix, перенесенных в Windows 95/NT.

Давайте рассмотрим некоторые параметры компилятора командной строки . Большинство параметров вы вряд ли будете использовать при написании небольших программ , но некоторые могут оказаться весьма полезными либо при написании новой программы , либо при импортировании приложения на C++ из другой среды . В табл . 8.1 представлены наиболее часто употребляемые аргументы командной строки компилятора с пояснениями .

Таблица 8.1. Наиболее часто используемые аргументы командной строки BCC32.EXE

-C Позволяет использовать вложенные комментарии в исходном файле

-I Позволяет определить каталоги , в которых будет производиться поиск заголовочных (.h) файлов

-L Позволяет определить каталоги , в которых будет производиться поиск подключаемых библиотек (.LIB)

-N Проверка переполнения стека . Если вы не используете этот аргумент , ваша программа может « повесить » то окно MS-DOS, в котором она запущена

-P Принуждает компилировать исходный код как код на C++. Этот параметр полезен , когда исходный файл не имеет расширения .cpp

-c Только компиляция . Используется при проверке синтаксиса и выяснения , почему же « виснет » среда разработки

-e Изменяет имя конечного исполняемого файла . По умолчанию имя совпадает с именем

первого скомпилированного модуля

-tW Создает приложение для Windows. Генерирует соответствующий код для начала

и завершения приложения

-v Позволяет производить отладку на уровне исходного текста

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

-x Разрешает обработку исключительных ситуаций

-H Использует предварительно скомпилированные (pre-compiled) заголовочные файлы в процессе компиляции . Может существенно ускорить процесс , если в вашей программе

-u Генерирует « подчеркивания » (_) для внешних имен . Очень полезен при создании DLL для использования с другими системами , например с Delphi или Visual Basic

-w Позволяет подавлять определенные предупреждения , которые вы не хотите видеть -U Удаляет определение заданного макроса . Полезен , если вы хотите заменить макрос функцией или удалить какой — то конкретный кусок кода #ifdef

Рассмотрим небольшой пример использования компилятора . Предположим , что у нас есть алгоритм , позволяющий вычислить факториал заданного числа . Если вы подозреваете , что в коде алгоритма есть ошибка и хотите его проверить , вы можете создать небольшую тестовую программу , запускаемую из командной строки . Предположим , что у нас был следующий код :

#include <stdio.h> #include <stdlib.h> #include <string.h> double fact(int nNum)

double dFact = 1.0;

for ( int i=1; i<=nNum; ++i ) dFact *= (double)i;

int main(int argc, char **argv)

if (argc < 2 ) return -1;

int nNum = atoi(argv[1]);

printf(» Факториал %d = %lf\n», nNum, fact(nNum)); return 0;

Эта программа вычисляет факториал числа , введенного пользователем . Чтобы скомпилировать ее из командной строки , вам надо набрать bcc32 fact.cpp . В результате компиляции вы увидите следующее :

d:\test>bcc32 fact.cpp Borland C++ 5.2 for Win32

Copyright (C) 1993, 1997 Borland International fact.cpp;

Turbo Link Version 2.0.68.0

Copyright (C) 1993, 1997 Borland International

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

Работа с компилятором из командной строки

в результате чего будет вычислен факториал числа 5. Вывод программы будет выглядеть

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

Факториал 5 = 120.000000

Компилятор командной строки бывает также полезен для тестирования в случае появившегося в CBuilder сообщения «Unknown Error #1» (« Неизвестная ошибка № 1»). Хотя в большинстве случаев эта проблема обычно решается поэтапным удалением файлов компиляции и сборки (*.il?), иногда она вызвана тем , что компилятор чего — то не понимает в вашем исходном коде . Перейдя в режим работы с командной строкой и скомпилировав модуль с различными аргументами , вы можете докопаться до ключа к разгадке .

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

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

предварительно скомпилировать ресурсные файлы для распространения скомпилированной версии ( файлы res) среди других программистов . Для этого фирма Borland предоставляет две различные программы работы с ресурсными файлами . BRC32.EXE — это 32- битный компилятор и компоновщик ресурсов . Эта программа скомпилирует ресурсный файл и свяжет его в работе с используемыми вами старыми приложениями Windows, которые требуют раздельной компиляции и сборки . Для запуска BRC32 используйте следующий синтаксис : BRC32.EXE filename , где filename — имя как вашего ресурсного файла (.rc), так и исполняемого приложения (.exe). В табл . 8.2 представлены часто используемые параметры компилято ра ресурсов .

Таблица 8.2. Часто используемые параметры компилятора ресурсов (BRC32.EXE)

-r Только компилировать файл , не связывая . То же самое , что запустить программу BRCC32.EXE -fo<filename> Делает <filename> именем выходного res- файла , по умолчанию это имя совпадает с именем входного файла с расширением .res

-fe<filename> Делает <filename> именем выходного исполняемого файла , по умолчанию это имя совпадает с именем входного файла с расширением .exe

-l Позволяет указывать путь для поиска подключаемых файлов

-x Указывает компилятору игнорировать переменную среды INCLUDE

и использовать только определенный вами путь к заголовочным файлам -Vd.d Позволяет пометить получившийся исполняемый файл как файл версии Windows d.d ( по умолчанию 4.0) для запуска в Windows 95/NT

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

STRINGTABLE DISCARDABLE BEGIN

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

101 » Первая строка .»

102 » Вторая строка .»

103 » Третья строка .»

Этот файл ресурсов позволит вам использовать в вашем приложении функцию LoadString , чтобы попасть на определенную строку в ресурсе . Для того чтобы скомпилировать этот файл , вам следует использовать синтаксис brc32 -r strings.rc .

С другой стороны , вы можете просто набрать brcc32 strings.rc . В обоих случаях будет сгенерирован новый откомпилированный файл ресурсов strings.res, который может быть включен в ваше приложение и использован для загрузки строк . Запуск указанных выше команд отобразится в окне командной строки следующим образом : d:\test>brcc32 strings.rc

Borland Resource Compiler Version 5.02

Copyright ( с ) 1990, 1997 Borland International.

All rights reserved.

Использование компилятора ресурсов вовсе не сложно , но в некоторых приложениях может дать очень неплохие результаты . Правда , вы скорее не будете использовать компилятор командной строки , а вместо этого просто включите файл ресурсов (.rc) в проект CBuilder, открытый в IDE, и позволите самой IDE запускать программу BRCC32.

Использование программы Implib

Программа Implib предназначена для создания библиотек импорта (import libraries) для DLL ( динамически связываемых библиотек ), которые вы хотите подключить к своему приложению . Важно использовать именно версию Borland CBuilder этой программы при создании библиотек импорта для использования в приложениях CBuilder. Более старые версии фирмы Borland или же аналоги других фирм создадут библиотеки , некорректно поддерживаемые CBuilder, что повлечет за собой появление в вашей программе сообщений об ошибках странного содержания . Мы рассмотрим использование DLL в CBuilder, равно как и создание DLL в CBuilder для других приложений , в следующей главе . А сейчас давайте просто рассмотрим те шаги , которые надо

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

Предположим , что у вас есть DLL, которую вы хотели бы использовать в вашем приложении . Эта DLL могла быть создана в CBuilder, в Visual C++, в Delphi или в любой другой системе , способной создавать DLL. Есть две основные вещи , которые вам хотелось бы сделать для использования этой динамической библиотеки (DLL). Во — первых , сгенерировать файл библиотеки импорта (.lib) для этой DLL, который можно подключить к вашему исполняемому файлу . Это делается командой implib . Во — вторых , вам бы хотелось знать , какие функции в DLL можно вызывать . Это получается так : вы берете только что сгенерированную implib библиотеку импорта и передаете ее как параметр команде tlib , которая создаст листинг функций , доступных в библиотеке . Используя эти две программы , вы можете создать файл листинга для любого стандартного DLL- файла в системе

Давайте используем программу implib для создания библиотеки импорта для одной из DLL в вашем каталоге Windows ( или WinNT в случае Windows NT 4.0) и посмотрим , что доступно в этой библиотеке для использования в вашем приложении . Например , в вашем каталоге Windows

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

находится файл Winsock.DLL. Winsock — это реализация библиотеки соединений через сокеты (sockets) под Windows, которая есть в Unix и других системах и которую можно очень здорово использовать для создания эффективных приложений для соединения через Internet.

Первым делом запустите программу implib с файлом WINSOCK.DLL, набрав следующую команду в командной строке :

C:\WINDOWS>implib winsock.lib winsock.dll

Borland ImpLib Version 2.0.140.1

Copyright (c) 1991, 1997 Borland International

После выполнения программы в каталоге C:\Windows ( в нашем случае ) должен появиться файл Winsock.LIB. Теперь вы можете изучить этот файл , используя программу tlib ( о которой мы поговорим позже ):

c:\WINDOWS>tlib winsock.lib, winsock.lst

TLIB 4.00 Copyright (c) 1987, 1997 Borland International

Как мы увидим чуть позже , эта команда создает файл листинга для библиотеки , в котором показаны все общие (public) имена ( идентификаторы ) из библиотеки . Общий идентификатор — это экспортированная (exported) функция или объект , которые вы можете использовать в своем приложении , связав его с библиотекой импорта . Вот небольшой фрагмент этого файла , показывающий функции , которые вы можете импортировать из файла WINSOCK.DLL:

Publics by module ACCEPT size = 0 ACCEPT

Глава 8• Антракт : инструменты CBuilder BIND

CLOSESOCKET size = 0 CLOSESOCKET CONNECT size = 0 CONNECT GETHOSTBYADDR size = 0 GETHOSTBYADDR GETHOSTBYNAME size = 0 GETHOSTBYNAME GETHOSTNAME size = 0 GETHOSTNAME GETNETBYNAME size = 0 GETNETBYNAME

Вы увидите функции , которые есть в документации к Winsock. Например , функция GetHostName возвращает вам имя сервера , к которому в данный момент существует подключение . Программа implib в комбинации с tlib может вам дать огромное количество информации о доступных функциях в DLL. Довольно много недокументированных функций Windows были найдены путем запуска программы implib с системными DLL и последующего просмотра листингов программы tlib. К примеру , USER.EXE — это не более чем замаскированная DLL. Попробуйте запустить implib с файлом USER.EXE ( находится в каталоге \Windows\System). После чего « скормите »

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

получившийся файл USER.LIB программе tlib и посмотрите на выходной файл USER.LST. Я уверен , что если вы будете смотреть достаточно внимательно , то найдете как минимум одну функцию , которой нет в официальной документации к Win32.

Работа с IDEToMak

Если вы раньше использовали ( или по — прежнему используете ) компилятор Borland C++ ( последняя версия 5.02), то вы , вероятно , захотите взять какие — нибудь существующие проекты и загрузить их в среду CBuilder. Зачем вам это нужно ? Чтобы удобнее работать с окнами ( формами ), а также чтобы конвертировать библиотеки DLL в новые VCL, — вот уже две причины , которые первыми приходят на ум .

К сожалению , компилятор Borland C++ держит информацию о проекте в специальном файле с расширением IDE, и этот *.IDE файл не совместим с CBuilder. В конце концов , не станете же вы ожидать , что две разные версии разных языковых оболочек будут совместимы ? Ну , в мире Windows, наверное , не станете , но вот в мире Borland — другое дело .

Программа IDEToMak конвертирует существующий IDE- файл проекта из Borland C++ в эквивалентный файл проекта (MAK) в системе CBuilder. Чтобы запустить программу IDEToMak, перейдите в каталог с IDE- файлом и введите :

Например , если у вас был проект в Borland C++, который назывался Test, то вы бы набрали :

В результате получился бы файл Test.MAK в каталоге Test. У программы IDEToMak нет опций ; это простая утилита , которая совершает прямое преобразование .

Как большинство компиляторов C++, Borland CBuilder поставляется с программой препроцессора . В CBuilder она называется CPP32.EXE. Препроцессор отвечает за замену всех директив препроцессора в полный исходный код приложения перед тем , как вызывается компилятор . Препроцессор работает с такими выражениями , как #include , #define , #ifdef и т . д . Представьте , например , что у вас был следующий исходный файл :

#ifdef WORKING int x = 1;

#define X_WORD 32 int main(void)

int z = X_WORD + 99;

// Здесь что — нибудь делаем с z return 0;

Это простое приложение использует несколько директив препроцессора ( #ifdef , #else , #endif , #define ). Если бы вы пропустили приложение через препроцессор , набрав

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

Borland C++ Preprocessor 5.2 for Win32 Copyright (c) 1993, 1997 Borland International TEST.CPP:

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

/* TEST.CPP 4: */int x = 2; /* TEST.CPP 5: */

/* TEST.CPP 9: */int main(void) /* TEST.CPP 10: */<

/* TEST.CPP 11: */int z = 32 + 99; /* TEST.CPP 12: */

/* TEST.CPP 15: */return 0; /* TEST.CPP 16: */

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

#include <vector> #ifdef WORKING int x = 1;

#define X_WORD 32 vector<int> intArray; int main(void)

int z = X_WORD + 99;

// Здесь что — нибудь делаем с z return 0;

Опять же , здесь нет ничего особенного . Мы просто добавили модуль из библиотеки стандартных шаблонов (STL), но вы , вероятно , будете очень удивлены , как и я , когда увидите , что размер получившегося файла test.i превышает 6 M байт . Это , в частности , показывает , почему компиляция программы , использующей STL, происходит намного дольше , чем компиляция программы , не использующей эту библиотеку . Просмотр полученного файла может занять несколько дней . Приятным моментом во всем этом является то , что препроцессор генерирует такой файл всего секунд за 30, а компилятор обрабатывает его ненамного дольше ( может быть , чуть меньше минуты ), целиком компилируя весь текст в полностью работающую программу .

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

Компилятор Borland C/C++ ver. 5.5.1

Этот компилятор c 2000 года бесплатно раздавался компанией Borland (тогда она временно носила имя Inprise). Единственным условием при скачивании была регистрация на сайте. Нынешний правопреемник Borland компания Embarcadero предоставляет возможность на тех же условиях скачать компилятор со своего сайта. https://downloads.embarcadero.com/free/c_builder. Если вы когда-нибудь регистрировались на сайте Borland, то ваша регистрация и сегодня действует на сайте https://www.embarcadero.com/, так что повторно регистрироваться не нужно.

Вопрос о том, стоит ли пользоваться таким старым продуктом, мы рассматривать не будем. Скажем лишь, что стандарт C++, которого придерживается компилятор, немного устарел. Для учебных целей это минус. С другой стороны, если вам нужно включить тексты на C в Delphi-проект, то вам придется пользоваться компилятором Borland, поскольку форматы объектных файлов у Borland и Microsoft различаются. Вы могли бы использовать компилятор C-Builder, если он у вас, конечно, есть. А если нет?

При запуске установочного файла компилятор по умолчанию заносится в директорию C:\Borland\BCC55, но вы вольны переписать его для работы в любое удобное для вас место, даже на флешку или CD-ROM. Никаких изменений в путях доступа или модификаций реестра при установке не происходит. Для удобной работы с компилятором вы должны произвести некоторые подготовительные действия. Прежде всего вы должны выделить рабочую директорию для проекта, которая при запуске компилятора должна быть текущей (отображаться в подсказке командного окна). В этой директории будут лежать исходные тексты ваших программ, туда же будут записываться результаты компиляции – исполнительные файлы и библиотеки. Кроме того в рабочей директории должны находиться несколько конфигурационных файлов, которые вы должны создать сами. Содержимое этих файлов мы опишем ниже.

В директории компилятора находятся несколько поддиректорий, из которых нам сейчас важны Bin, Include и Lib. Пути к этим директориям должны быть известны компилятору при его работе В директории Bin находятся исполнительные файлы компилятора. Для изготовления exe-файла нам потребуется запустить сам компилятор bcc32.exe и компоновщик ilink32.exe. Чтобы операционная система могла найти файлы компилятора без указания их полного пути, мы могли бы включить директорию BIN в список переменной окружения PATH. Однако мы пойдем другим путем: в рабочей директории, где расположены файлы проекта, мы создадим файл run.bat следующего содержания:

Запишем также в рабочую директорию файлы конфигурации для компилятора и для компоновщика:

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

Изготовление exe-файла

Создадим теперь пробный файл на языке CPP:

Теперь запустим компиляцию следующей командой:

При этом запустится компилятор, который сформирует объектный файл hello.obj. В конце своей работы компилятор запустит компоновщик ilink32. Компоновщику понадобятся библиотеки компилятора, которые он будет искать в директории Borland\Lib. Результатом компоновки будет исполнительный файл hello.exe, который при выполнении выдаст на консоль строку «Hello world!». Итак, компилятор заработал.

Компилятор и компоновщик можно запускать по отдельности. Например, можно собрать файл hello.exe следующим образом:

Ключ /c приказывает компилятору «только компилировать», то есть не запускать после компиляции компоновщик. Входные параметры к компоновщику отделяются друг от друга запятыми. Сначала идут объектные файлы. Среди них начальный объектный файл компилятора c0x32.obj. В конце команды мы видим имена библиотек. Здесь будет всегда присутствовать библиотека import32.lib и какая нибудь из библиотек C. У нас это cw32.lib. При запуске компилятора и компоновщика возможно также задание ключей, указывающих какого типа приложение нам нужно. В данном случае ключей нет, но в следующем примере без них уже не обойтись.

Изготовление dll

Надежнее всего для экспорта создать дополнительный файл с расширением def. Это позволяет полностью контролировать имена, которые библиотека будет экспортировать. На языке C проблема имен еще не стоит так остро, но если ваша библиотека будет написана на C++, то без def-файла контроль имен становится нетривиальной задачей.

Пусть мы хотим чтобы с библиотекой можно было работать из программ, написанных на других языках. Каждый язык пытается работать с библиотекой по своим соглашениям. Если конкретный язык и соглашения заранее неизвестны, то можно выбрать наиболее универсальный вариант соглашений, а именно stdcall. Именно по этому соглашению работают функции Windows API.

Компиляцию мы будем делать отдельным bat-файлом

Получившаяся таким образом библиотека получается статической и многопоточной. Можно подключить ее к программе на Delphi следующим образом:

Получившаяся библиотека может быть также использована в проекте Visual Basic 6.0:

Конечно, нужно, чтобы библиотека при исполнении находилась по отношению к exe-файлу или проекту «доступным образом».

Работа с dll из программы на C

Вместе с dll обычно получают статическую библиотеку импорта. Для этого
у компоновщика ставят дополнительный ключ /Gi. В этом случае компоновщик
создает дополнительный файл с расширением lib. Это и есть статическая
библиотека. С помощью нее связь с dll можно установить на этапе
изготовления exe-файла. Например, программу

можно откомпилировать командой:

Если у вас есть неизвестная динамическая библиотека dll, то библиотеку импорта можно из нее получить при помощи утилиты implib:

Также можно получить список имен, которые эта библиотека экспортирует. Утилита impdef может создать файл def, который содержит помимо этого списка и другую полезную информацию.

Другая полезная утилита, которая может распечатать экспорт/импорт имен неизвестной библиотеки dll, называется tdump

Dll для FireBird 1.5

Такая библиотека нужна, если вы хотите написать собственную User Defined Function (UDF). Приведем пример UDF, которая форматирует время. Три входных целых параметра содержат часы/миуты/секунды, четвертый параметр содержит небольшой текст, который обычно содержит строку «am» или «pm». Функция возвращает указатель на строку символов. Память под эту строку должна быть выделена функцией из библиотеки msvcrt.dll, только в этом случае FireBird сможет корректно освободить эту память

Получившуюся библиотеку testudf.dll следует положить в нужную директорию, про которую знает FireBird. У меня это директория C:\Program Files\Firebird\Firebird_1_5\UDF

Теперь мы можем описать UDF в FireBird:

и испытать ее, к примеру, вызовом из хранимой процедуры:

Использование языка C в проектах Delphi

Следующий файл компилируем командой

Этот файл содержит функцию, котора добавляет 10 к своему параметру и возвращает результат. Обратите внимание на слово __fastcall в заголовке функции. Можно было бы описать функцию как __stdcall или __cdecl. Тогда потребовался бы соответствующий описатель при объявлении этой функции в паскалевской программе.

Следующий файл присоединяет файл fun.obj к модулю objunit

Функция fun описана здесь без каких либо описателей.
По умолчанию компилятор предполагает описатель register.
Если бы в C-программе функция была бы без описателя __fastcall,
то в паскалевской программе пришлось бы вставить cdecl, а перед
именем функции поставить знак подчеркивания.

Получившийся файл objunit.tpu можно теперь использовать
в программах на паскале:

На этом пути нас могут ожидать непреодолимые трудности, если мы по неосторожности (явно или неявно) обратимся из C-программы к каким нибудь функциям C. Иногда трудости удается преодолеть путем извлечения соответствующих объектных модулей из библиотек C и включение их в модуль tpu.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *