webew
Войти » Регистрация
 
MySQL/MariaDB
С/C++

Hello MySQL From WinAPI/MFC

6 августа 2010, 9:09

В настоящее время система управления базами данных 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:

MYSQL mysql;
2) Инициализируем объект типа MYSQL (чтобы далее использовать его для подключения к mysql-серверу):
mysql_init(&mysql);
3) Подключимся к mysql-серверу:
mysql_real_connect(&mysql,%ХОСТ%,%ЛОГИН%,%ПАРОЛЬ%,"mysql",%ПОРТ%,NULL,0);
4) Выполним запрос на получение списка пользователей:
mysql_query(&mysql,"SELECT distinct User FROM mysql.user");
5) Прочитаем результат запроса:
MYSQL_RES* mysqlres = mysql_store_result(&mysql);
6) В цикле извлечем все значения:
MYSQL_ROW row;
while ((row = mysql_fetch_row(mysqlres)))
{
    /* Произведем нужные действия, в данном случае заполним ListBox на экране */
}
7) Освободим память, выделенную под результат выполнения запроса
mysql_free_result(mysqlres);
8) Закроем соединение с mysql, освободим выделенную для этого память
mysql_close(&mysql);

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):

mysqlpp::Connection con(false); /*false для того, чтобы отменить генерацию исключений */
2) Подключимся к mysql-серверу (функцией connect объекта conn):
con.connect("mysql",%ХОСТ%,%ЛОГИН%,%ПАРОЛЬ%,%ПОРТ%);
3) Создадим объект-запрос (объект query класса Query того же пространства имен) и зададим ему нужный текст запроса:
mysqlpp::Query query = con.query();
query << "SELECT distinct User FROM user";
4) Выполним запрос функцией store объекта query и получим результат в объект res класса StoreQueryResult того же пространства имен:
mysqlpp::StoreQueryResult res = query.store();

После успешного выполнения функции из объекта res извлекаются результаты и помещаются в ListBox на диалоге. Память выделенная для хранения результата выполнения запроса освободится (равно как и завершится соединение с mysql-сервером в деструкторах объектов).

Резюме: программа работает аболютно по тому же принципу, что и HelloMysqlWinAPI, самое большое отличие в том, что для выполнения ряда определенных действий используются C++-обертки, как то: создание диалога, работа с mysql-сервером.

Исходники можно скачать здесь.

© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Добавить комментарий
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: