Главная » C++, C++ Builder » Работа с Windows API в CBuilder

0

Windows API (Application Programming Interface, интерфейс программирования приложений в Windows) незримо присутствует за всем блеском VCL и чудесами интегрированной среды разработки CBuilder. В VCL нет ничего, что нельзя было бы сделать в Windows API, и по очень простой причине. Все в Windows работает через API. Операционная система сама поддерживает этот интерфейс и использует его во всех своих вспомогательных программах. Независимо от того, насколько сложен код, в конце концов все сводится к вызовам API.

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

Избегать Windows API — правильный подход, я настоятельно рекомендую вам его.  Однако бывает, что VCL не может сделать то, что вам нужно, тем самым повергая вас в пучину Windows API (если вы, конечно, хотите сделать работу). Если вы программист на Delphi или Visual Basic, то вы уже, наверное, содрогаетесь от ужаса. Общение с Windows  API в этих языках может стать кошмаром, если нужная функция запрашивает типы данных, которых у вас нет.

К счастью, CBuilder использует не Basic или Pascal, а C++. Общение с Windows API из C++ не труднее, чем это было на изначальном языке программирования для API — С. Так что ваша работа уже будет проще. Есть только один вопрос: когда нужно обращаться к Windows API?

В этой главе мы изучим несколько вещей, для которых нужно использовать Windows API. Например, в CBuilder нет прямого способа выяснить, запустил ли уже пользователь копию вашего приложения. Если ваша программа надеется на единоличное владение каким-нибудь файлом на диске (например, базой данных) и запускаются две копии приложения, то результаты будут просто страшными. Исследование проблем, связанных  с множественными копиями программы, запущенными одновременно, — нетривиальная работа. Обычно гораздо проще запретить пользователю   запускать   вторую   копию.   Это   не   годится   для   небольших   утилит,   которые

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

Еще одним примером использования Windows API может служить определение  размера свободного места на диске, получение метки диска, атрибутов файлов и другой информации, хранящейся в системе. Этот вопрос также будет рассмотрен в текущей главе.

Общение с файлами, «перетащенными» на ваше приложение , — одна из основных проблем при использовании операционной системы Windows 95/NT. Например, вам может понадобиться разрешить пользователю выбрать несколько файлов для обработки в генераторе отчетов. Другим программам может, например, понадобиться список перетащенных файлов для отправки их по Internet. Что бы вы ни делали, VCL поможет вам — но не всегда! Добавить обработчик сообщения, которое посылается при перетаскивании файлов, тривиально. Но объяснить системе, что вам в первую очередь нужно перетащить файлы, исключительно средствами VCL невозможно. В этой главе вы поймете, как это сделать с минимумом проблем и затрат.

Последняя проблема для программиста — разработка окон нестандартного вида, которые почему- то нравятся некоторым пользователям. Как именно вы объясните VCL, что хотите, чтобы ваши кнопки были круглыми? Ответ лежит — вы угадали — в Windows API. Его мы также разберем в данной главе.

Поиск нужной функции API

Самая большая проблема при работе с несколькими тысячами функций Windows API заключается не в их вызове, а в выборе нужной. Здесь реальную помощь оказывают файлы справки по Win32 SDK. Как это ни странно, Borland поставляет копии файлов Win32 SDK Help вместе с системой CBuilder. Переместившись в каталог CBuilder\Help, вы увидите другой каталог, MSHelp. Внутри этого каталога вы найдете несколько файлов справки, включая файл справки KnowledgeBase (база знаний) (Kbase.hlp) и файл справки Win32 SDK (Win32SDK.hlp). Вы можете или добавить эти файлы к среде Borland OpenHelp, или просто добавить их в меню Tools интегрированной среды CBuilder.

Файл справки KnowledgeBase полезен, когда вы пытаетесь выяснить, каким именно образом решить какую-нибудь стандартную программистскую проблему.

Пролистав этот файл справки, я тут же нашел информацию о таких проблемах, как:

·    получение информации о гибких дисках;

·    получение имени файла через ссылку (instance) на окно;

·    GLLT.EXE: Пример: Демонстрирует простую подсветку в OpenGL.

Эти примеры — всего лишь кусочек сотен независимых статей базы KnowledgeBase, которая представлена в виде файла справки для помощи в написании и отладке приложений под Windows. По очевидным причинам этот файл справки не содержит информации о CBuilder (в конце концов, это не продукт Microsoft), но знание нужной для данной задачи функции API может помочь вам при написания того, что вам нужно в CBuilder.

Второй файл в этом каталоге, Win32SDK.hlp, из тех, к которым вы будете обращаться наиболее часто. Этот файл содержит полный листинг функций Win32 SDK в формате справочной системы. Вы можете найти нужную функцию по имени, чтобы посмотреть, какие у нее параметры, просматривать функции по категориям и исследовать структуры, используемые данными функциями API в этом файле справки.

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

Итак, как именно вам найти функцию, делающую что-то, нужное вашему приложению? Ответ прост: искать функцию, более-менее подходящую по названию,  или  спросить кого-нибудь,  кто уже этим занимался. Вот где пригодятся конференции Internet News Groups (USENET) или книжки типа этой. Вы обычно учитесь в процессе, и те из вас, кто занимался этим с тех пор, когда SDK был единственным вариантом, быстро найдут нужную функцию. Люди, стартовавшие прямо с CBuilder, находятся здесь в определенном затруднении. Я настоятельно вам рекомендую взять хорошую книгу по основам программирования под Windows и прочитать ее от корки до корки. Вы, может быть, никогда и не будете ничего писать на С на низком уровне, используя SDK, но тем не менее вы ничего не потеряете, если будете понимать, как это делается. Это также поможет вам оценить, какой объем работы делают за вас автоматически VCL и CBuilder.

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

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии