вторник, 20 марта 2012 г.

Динамическое и статическое подключение DLL

Постараюсь кратко рассказать про подключение библиотек DLL. Но сначала ещё немного поработаем с элементами интерфейса. О том как создать простое диалоговое приложение с помощью MFC я уже писал.

Первым делом приложение должно позволять вводить какое-то число, и нам также необходимо по нажатию кнопки как-то выцепить это число из edit box'а. Делается это так.

Нажимаем на заготовке (каркасе) приложения правой кнопкой мыши на нужный элемент и добавляем новую переменную.


Нам необходимо две переменные. Одна будет предоставлять методы для Edit Box - такие как получение значения из этого поля. 


Вторая переменная просто будет хранить значения типа INT, полученные из Edit Box. Эту переменную можно было и вручную написать в .h файле, отвечающим за интерфейс, но мы её добавим по-ленивому.

   

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

Теперь опять выбираем вкладку с каркасом приложения, клацаем два раза на первую кнопку и среда сразу открывает нам метод по обработке нажатия клавиш. Теперь запилим туда вот такой код:

void CMFC22Dlg::OnBnClickedButton1()

{
// TODO: Add your control notification handler code here
CString s;
m_CEdit1.GetWindowTextA(s);
m_INTedit1 = atoi(s);
AfxMessageBox(s);
}

Результат посмотрите сами.

Наконец о подключении библиотек!

Статическое подключение. Используется понятие "раннее связывание". Это значит, что DLL "прикрепляется" на этапе компиляции - compile-time. Это самый простой способ подключения, но для него необходимы следующие файлы: сама .DLL, хидер с описанием функций .h, и библиотечный файл .lib - все они создаются при компиляции библиотеки и закидываются в проект, требующий подключения библиотек.

Для подключения требуется вписать вот такой код:
// статическое подключение DLL

#include "myStatLib.h"
#pragma comment(lib, "myStatLib.lib")

Теперь можно напрямую вызвать необходимые функции из dll.

Динамическое подключение. Использует "позднее связывание" или run-time. Подгрузка библиотеки происходит только при вызове функции. Разумеется придется самим контролировать процесс выгрузки библиотеки. Следующий код прописан в .h файле - тут определяется сначала тип указатель на функцию, а потом переменная callFDLL, являющаяся указателем на функцию. hlib - какая-то winapi структура, которая будет содержать описание подсоединенной DLL'ки. Готовую dll необходимо скопировать в проект.
protected:// типы для динамической загрузки DLL

typedef void (WINAPI *MYPROC)();
MYPROC callFDLL;
HMODULE hlib;

В обработчик второй кнопки должны добавить следующее:
void CMFC1Dlg::OnBnClickedButton2()

{
CString s;
EditControl2.GetWindowTextA(s);
m_edit2Value = atoi(s);

hlib = LoadLibrary("dllG.dll");
callFDLL = (MYPROC) GetProcAddress(hlib,"CLDyn");

FreeLibrary(hlib);
}

CLDyn - имя функции, которую мы вызываем из dll.

Создать DLL. Не буду описывать опять процесс создания проекта в MSVS - там методом научного тыка всё можно создать. Но код простейшей dll стоит выложить.

Файл dllG.h
extern __declspec(dllexport) void CLDyn(const int NN);

Файл dllG.cpp
#include <windows.h>


extern __declspec(dllexport) void CLDyn()
{
MessageBoxA(GetActiveWindow(),(LPCSTR)("Hello from Dynamic Loaded Library!"),(LPCSTR)("Hi"),MB_OK | MB_APPLMODAL);
}

Файл dllG.def - для динамического подключения этот файл необходим, т.к. позволяет определить нормальные названия функций.
LIBRARY "dllG"

EXPORTS
CLDyn @1



среда, 14 марта 2012 г.

На перспективу

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


Так вот, наша Беларусь, как и большинство других стран, проводит обязательную сертификацию средств защиты информации. И если у продукта такого сертификата нет, то и использоваться в серьезных местах он не может. Так например, Windows XP и Windows 7 сертификации не имеют и потому на предприятиях с ценной информацией использоваться не могут, хотя защита у этих систем имеет класс C2 (ц2 очень серьёзный класс). Однако никто не гарантируют, что товарищ Билл не сделал там никаких закладок (а такие слухи действительно есть). Такая же тема с некоторыми криптографическими преобразованиями.

Есть у нас такое заумное НИИ ТЗИ, которое занимается разработкой средств для использования в нашей стране. Я сначала удивился - неужели свою систему будут писать вместо использования "Окон"? Ну не то чтобы писать... Ребята берут исходники ядра линукса, настраивают на нем своё ядро безопасности - и готова система абсолютно защищенная.

А сами по себе системы довольно уязвимы. Чтобы получить информацию с компьютера с защищенным паролем линуксом, не надо даже взламывать этот пароль. Берется Live CD с линуксом, загружаемся с него, заходим под root и получаем господство над информацией. С виндой почти тоже самое - вставить свой веник, загрузиться с него и получаешь неограниченный доступ к уже имеющемуся в компе венику.

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

понедельник, 12 марта 2012 г.

Старый добрый MFC

Есть у меня такой предмет "Технологии программирования". Ведет клёвая тётя - какой-то крутой программер в Минской компании. Она задала нам сделать лабу по работе с dll. Задание таково:

"Необходимо написать программу, имеющую графический интерфейс (GUI), на С++. Программа должна иметь два поля Edit и две кнопки. Первая группа Edit+Button для работы со статической библиотекой, вторая - для подключенной динамическим образом. В поле Edit ввести число и по нажатию кнопки выскакивает приветственное сообщение столько раз, сколько было введено."

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

Итак! Грузим Microsoft Visual Studio 8 -> File -> New -> Project. Выбираем Visual C++ - MFC и выбираем приложение которое хотим создать - MFC Application.

По нажатию "Ok" среда предлагает нам настроить внешний вид нашего приложения. Здесь важный для нас шаг выбрать "Типа приложения". Для нас должно быть "Диалоговое приложение"(Dialog based). Именно этот вариант предполагает наличие всяких кнопочек и полей и избавит от ненужных мытарств с документами. Окно выглядит так:

Так же обязательно выбираем "Use MFC in a static library". Настройки в других вкладках по вкусу.

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

Нас интересуют только выделенные файлы - это два .cpp файла с кодом, два их хидера .h и .rc файл ресурсов, с помощью которого и вызывается это диалоговое окно приложения ( .rc -> Dialog -> IDD_MFCPROJECT_DIALOG).

Справа обращаем внимание на вкладку Toolbox (вызывается сочетанием клавиш Ctrl+Alt+X). Отсюда мы натягаем нужные нам элементы и получим что-то похожее на моё приложение.


Очень удобно в проекте клацнуть два раза на кнопку, нажатие которой хотим обработать, и сразу попадаем в её функцию-обработчик. А клацаем правой кнопкой по кнопке -> Properties  - можем настроить элемент (Например поменять все надписи). Можно запускать приложение Ctrl+F5.

Вот такая простая магия и никакого кода.

среда, 7 марта 2012 г.

Конкурс от Texas Instruments

На моей кафедре работает довольно активный преподаватель, который, наверное, больше других любит давать студентам творческую работу. Он всегда старается найти студентов для участия в том или ином конкурсе и даже параллельно с лабами предлагает поучаствовать в студенческих проектах. В прошлом семестре мы с двумя ребятами участвовали в IEEExtreme Programming Competition по его предлогу. К слову, он возглавляет университетский IEEE союз, хотя сейчас он скорее мертв, чем жив. Мне вообще-то нравится любая подобная активность, но времени на неё не находится...

На этот раз мы с ребятами решили поучаствовать с конкурсе от Texas Instruments. Конкурс называется Analog Device Contest. Самая приятная его фишка это возможность заказать любые комплектующие этой компании на сумму до $100.


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

Проект называется Intelligent Greenhouse. Ну а дальше вы поняли короче. Сегодня я написал ребятам письмо что кому делать, потому что если не начнешь командовать, то никто ничего так и не начнет, да и самому как-то себя организовать хочется.


Моя работа будет заключаться в отладке всего этого комплекса. Со схемотехникой тоже я подружусь. В следующий раз опишу устройства которые будем заказывать. А заказать надо будет до 26 апреля, т.е. работать мы будем без комплектующих - должно быть уже полностью продуманно устройство, разработаны схемы и алгоритмы и в апреле мы на семинаре должны представить проделанную работу.

четверг, 1 марта 2012 г.

О программировании

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

Полтора года назад под одним из моих постов о жизни и iTransition интересующийся товарищ оставил коммент с просьбой подсказать вопросы собеседования. Поэтому сегодня я кратко поговорю о программировании.

Внешне такие компании, как EPAM или iTransition, кажутся довольно попсовыми - у простых студентов популярных ВУЗов давно уже выработалось соответствующее отношение к ним, которое передается от старших курсов младшим. Обе компании, кстати имеют очень крепкое ядро из грамотных специалистов. Так, Itransition, начинали молодые ребята с очень грамотным подходом во главе с Сергеем Гвардейцевым, ибо руководствовались серьезной литературой, а не только энтузиазмом.

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

Не так уж туда и трудно попасть, как многим кажется, но действительно надо хотеть этого и работать над своими знаниями. Я пробовал поступить на курсы iTransition по разработке ПО после окончания второго курса. Сейчас понимаю, что был тогда слишком юн для этого и знания были никакие вообще. Зато получил огромный опыт для себя. Ходите на собеседования время от времени - это позволяет понять цену себя на рынке, потренироваться в продаже себя и получить мотивацию для добывания новых знаний.

Минимальное достаточное условие, чтобы втереться в доверие. Критерий Коши? ;)

1. Инвестируем год в изучение литературы по нужному направлению, тренируем и разбираем каждый пример из книг.
2. Изучаем хотя бы 4 основных метода сортировки так, чтобы смогли написать код на листике бумаги. Сюда же относим ещё несколько самых известных алгоритмов а-ля вычисления НОД, числа Фибоначчи и т.д.
3. Мы должны уметь как минимум понимать англоязычные мануалы по проге. Разговорный английский важен. Тут можно готовить темы "Моё хобби", "Мои дальнейшие цели в жизни"...
4. К этому времени уже стоит понимать основные отличия ООП от структурных методов.
5. Послать резюме.

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