Hello MySQL From WinAPI/MFC
В настоящее время система управления базами данных MySQL в большей степени используется для web, нежели для desktop-приложений (особенно под windows, где предпочтение, естественно, отдаётся MSSQL-серверу), однако, разумеется, вышеупомянутая ниша desktop-разработок под windows с использованием mysql вовсе не пустует.
Данная статья создана для демонстрации того, как можно без особых сложностей взаимодействовать с mysql из программ, написаных на языках C и C++, использующих такие технологии для построения GUI-приложений под Windows, как функции WinAPI и MFC.
Материал в большей степени ориентирован на аудиторию, которая
использует WinAPI/MFC в своих проектах, но может быть полезна и для "непосвященных" в данные
технологии.
Ниже будет приведено две программы - HelloMysqlWinapi и
HelloMysqlMFC, которые написаны с использованием WinAPI и MFC соответственно.
Программы, приведенные в статье, написаны на языках c и c++, разработаны
в IDE Microsoft Visual Studio 2005.
Для работы с MySQL используется "родное" API от разработчиков MySQL (в данной статье не было цели продемонстрировать работу с MySQL другими средствами, например ODBC; лишь упомяну, что для работы с MySQL через ODBC существует коннектор, который можно скачать здесь).
Обе программы создают диалоговое окно, на котором имеется дочернее окно ListBox. В него выводится список пользователей того mysql-сервера, к которому производится подключение. Параметры подключения заданы в ini-файле (одноименном с именем программы, то есть программа HelloMysqlWinapi, которая, например, расположена в каталоге "c:\Myprograms\HelloMysqlWinapi", будет пытаться открыть файл "c:\Myprograms\HelloMysqlWinapi\HelloMysqlWinapi.ini"). Чтобы получить список пользователей, пользователь, под которым происходит подключение к mysql-серверу, должен обладать достаточными привилегиями.
HelloMysqlWinapi
Приложение HelloMysqlWinapi написано на языке С, для построения GUI
используются функции Winapi, для работы c mysql-сервером используется mysql c api.
Вместе с исходниками программы
(
HelloMysqlWinapi.c - непосредственно исходный код
HelloMysqlWinapi.h - здесь расположены некоторые
константы-идентификаторы
HelloMysqlWinapi.rc - здесь расположены ресурсы программы
(описание диалогового окна, которое запускается в программе)
)
к проекту должен быть прилинкован файл libmysql.lib, в каталоге с проектом должен находится
подкаталог mysql с нужными header-файлами, в проекте используется libmysql.dll.
Программа работает следующим образом:
С помощью функции WinAPI GetModuleFileName определяется полный путь доступа к файлу, в котором
находится программный модуль (чтобы даже в том случае, если программа запускается по ярлыку путь к
ini-файлу верно определился. Далее "отрезается" имя программы, взамен помещается
HelloMysqlWinapi.ini. Например, если программа называется "HelloMysqlWinapi.exe", и она находится в
каталоге "c:\Myprograms\HelloMysqlWinapi", то функция GetModuleFileName возвращает
"c:\Myprograms\HelloMysqlWinapi\HelloMysqlWinapi.exe", далее отрезается "HelloMysqlWinapi.exe",
к получившемуся пути "c:\Myprograms\HelloMysqlWinapi\" "приклеивается" имя ini-файла
"HelloMysqlWinapi.ini", таким образом в итоге программа пытается прочитать параметры подключения из
файла "c:\Myprograms\HelloMysqlWinapi\HelloMysqlWinapi.ini".
Из файла с настройками с помощью WinAPI-фукнции GetProvateProfileString извлекаются параметры
подключения к mysql - хост, логин, пароль и порт.
Функцией WinAPI DialogBox cоздаётся модальный диалог и при инициализации этого диалога
(при обработке сообщения WM_INITDIALOG) происходит подключение к mysql-серверу, получение списка
пользователей и отключение от mysql-сервера. В случае благополучного получения списка пользователей
ListBox на диалоге заполняется именами пользователей. Выход из программы можно осуществить нажатием на
кнопку "Выход", нажатием на клавиши Escape или Enter.
Освещу несколько подробнее то, как производится работа с mysql-сервером при
помощи mysql c api (именно оно используется в этой программе).
Все необходимые объявления находятся в файле mysql.h.
1) Создадим идентификатор соединения с mysql:
while ((row = mysql_fetch_row(mysqlres)))
{
/* Произведем нужные действия, в данном случае заполним ListBox на экране */
}
HelloMysqlMFC
Приложение HelloMysqlMFC написано на языке C++, для построения GUI
используеися библиотека MFC, для пущей "плюсатости" приложения для работы с mysql используется
библиотека Mysql++.
Самый простой и естественный способ создания MFC-приложения - воспользоваться мастером создания
приложений, который встроен в каждую Microsoft Visual Studio. В VS 2005 (в которой и были созданы
описываемые приложения) этот мастер вызывается следующим образом Меню File => New => Project, в Project
Types нужно выбрать вкладку Visual C++, в ней пункт MFC и выбрать тип приложения MFC Application. Далее
следовать инструкциям мастера.
Приложение HelloMysqlMFC - Dialog Based.
Это означает в том числе то, что это приложение имеет два основных класса:
1) Класс работы приложения CHelloMysqlMFCApp, наследуемый от CWinApp.
Определение класса находится в файле HelloMysqlMFC.h,
реализация класса соответственно в HelloMysqlMFC.cpp.
2) Класс диалога, который вызывается в приложении CHelloMysqlMFCDlg,
наследуемый от CDialog.
Определение класса находится в файле HelloMysqlMFCDlg.h,
реализация класса соответственно в HelloMysqlMFCDlg.cpp.
Для ускорения процесса компиляции в проектах ATL/MFC часто используется
технология предкомпилированных заголовков
(Precompiled Headers).
Для сборки таких проектов используются два специальных файла - stdafx.h и stdafx.cpp,
которые нужны для генерации файла предкомпилированных заголовков (файл stdafx.h подключается в
каждом h-файле, который должен попасть в вышеупомянутый файл предкомпилированных заголовоков
(обычно он имеет расширение .pch).
Файл resources.h содержит константы-идентификаторы дочерних окон
на диалоге. Обычно создание/размещение дочерних окон на диалоге осуществляется с помощью редактора
ресурсов, при этом модификация файла resources.h идет автоматически.
К проекту должны быть прилинкованы файлы libmysql.lib,
mysqlpp_d.lib, mysqlpp.lib.
В каталоге с проектом должны находится подкаталоги mysql и lib (в них расположены необходимые для
работы файлы mysql и mysql++), программа использует libmysql.dll, mysqlpp_d.dll и
mysqlpp.dll.
Debug-версия программы использует mysqlpp_d.lib и mysqlpp_d.dll,
release-версия использует mysqlpp.lib и mysqlpp.dll соответственно.
Класс CWinApp содержит интересующий нас виртуальный
метод InitInstance.
В этом методе происходит инициализация всего приложения, в нем же происходит вызов диалога, который и
определяет в данном случае работу приложения.
Класс CHelloMysqlMFCApp, который наследует CWinApp, должен содержать перегруженный метод
InitInstance. Реализация метода InitInstance класса CHelloMysqlMFCApp пытается прочесть
параметры из конфигурационного ini-файла программы. В том случае, если это невозможно (файл поврежден,
отсутствует или не содержит необходимой информации), то выводится cообщение об ошибке и программа
прекращает свою работу.
Далее создаётся диалог (объект класса CHelloMysqlMFCDlg), в него функцией SetConnectionParameters (это пользовательская функция) передаются параметры соединения с mysql-сервером, после вызывается функция диалога DoModal, которая, собственно, инициализирует диалог и запускает его обработчик сообщений. В отличие от WINAPI в MFC функция-обработчик сообщений не задаётся явно, но на каждый тип сообщения, которое программист хочет обработать сам, можно задать функцию-обработчик. Например, для сообщения WM_INITDIALOG в классе CHelloMysqlMFCDlg есть виртуальная функция OnInitDialog, код которой вызывается при обработке сообщения WN_INITDIALOG.
Как и в HelloMysqlWinapi при обработке сообщения
WM_INITDIALOG программа пытается подключиться к mysql-серверу, получить список
пользователей и заполнить ими ListBox на диалоге.
Полученные строки добавляются в ListBox на форме диалога (ListBox в классе представляет переменная
m_ListBox класса CListCtrl, которая была связана с ListBox'ом на форме функцией
DDX_Control).
В том случае, если соединение с mysql-сервером было невозможно, то
функцией PostMessage в очередь сообщений окна становится сообщение о завершении работы диалога.
Освещу несколько подробнее то, как производится работа с mysql-сервером при
помощи библиотеки mysql++(именно она используется в этой программе).
Все необходимые объявления находятся в файле mysql++.h.
1) Создадим идентификатор соединения с mysql (объект con класса Connection пространства
имен mysqlpp):
query << "SELECT distinct User FROM user";
После успешного выполнения функции из объекта res извлекаются результаты и помещаются в ListBox на диалоге. Память выделенная для хранения результата выполнения запроса освободится (равно как и завершится соединение с mysql-сервером в деструкторах объектов).
Резюме: программа работает аболютно по тому же принципу, что и HelloMysqlWinAPI, самое большое отличие в том, что для выполнения ряда определенных действий используются C++-обертки, как то: создание диалога, работа с mysql-сервером.
Исходники можно скачать здесь.© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.