Процесс создания и использования библиотек DLL .
Процесс создания динамической библиотеки проходит в два этапа. Первый из них заключается в создании файла-заголовка (*. h ), который определяет основные свойства проекта.
С помощью "визарда" среды Microsoft Visual C++ создайте новый проект, выбрав в качестве типа проекта Dinamic Linked Library , после чего определите "пустой проект" ( empty project ). Теперь вам предстоит самостоятельно создать файлы проекта. Пусть имя вашего проекта будет funlib .
Создайте файл заголовка – funlib . h (при помощи меню File\New..., выбрав файл-заголовок ) . В этом файле наьерите следующий текст :
// File funlib.h
#define EXPORT extern "C" __declspec(dllexport)
EXPORT BOOL CALLBACK return333();
EXPORT int CALLBACK MyInc(int i);
Первая строка файла определяет некоторую директиву EXPORT , которая будет использоваться для подключения сервисов, необходимых для создания ссылок на экспортируемые функции (то есть функции, которые могут быть использованы или импортированы другими программами). Следующие две строки являются предварительным объявлением функций, директива EXPORT и делает их динамическими функциями.
Теперь осталось написать обычный текст программы *. cpp , который мало чем отличается от обычного:
//funlib.cpp
#include< windows.h>
#include< string.h>
#include "fulib.h"
– 101 –
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
return TRUE;
}
EXPORT BOOL CALLBACK EdrCenterText()
{
return 333;
}
EXPORT int CALLBACK MyInc(int i)
{
return ++i;
}
Незнакомой здесь является только функция DllMain, которая является аналогом функции main для консольных приложений и функции WinMain для приложений, написанный под Windows . Эта функция автоматически вызывается при загрузке любой dll . Возвращаемое значение TRUE свидетельствует об успешной загрузке и инициализации внутренних ресурсов. Остальные две функции являются обычными функциями пользователя, а директива EXPORT уже нам знакома. Все. Компилируем проект и dll готова!
Настала пора ее использования. Для этого создадим обычное консольное приложение Win 32 и назовем его usedll . Для использования funlib . dll необходимо выполнить следующие: поместить в каталог проекта файлы funlib . h и funlib . lib . Второй файл является результатом компиляции предыдущего проекта и его можно найти в каталоге Debug . Кроме этого, в меню Project\Settings \ Link, Категория General, поле Object\library modules необходимо вписать имя файла-библиотеки для организации настроек связывания. Текст программы usedll.cpp приведен ниже .
// usedll.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "iostream.h"
#include "funlib.h"
int main(int argc, char* argv[])
{
cout<<return333()<<endl;
cout<<MyInc(5)<<endl;
return 0;
}
Данная программа выполнится если в каталоге, где располагается файл usedll . exe расположен файл динамической библиотеки funlib . dll . В результате выполнения данной программы на экране вы увидите следующую картину:
В заключении следует отметить, что используя механизмы динамического связывания, можно определять не только функции, но переменные и даже классы.
Второй способ использования DLL
Рассмотренный выше способ написания программы, использующей динамически подключаемые библиотеки пригоден только в том случае, когда вы сами создали библиотеки, или, по крайней мере, вы имеете в наличии файл библиотеки *. lib . Однако, очень часто случается так, что есть только *. dll (или она только планируется). В этом случае можно использовать другой способ, который не требует для компиляции проекта наличия файлов, связанных с вызываемой *. dll .
Применение данного способа заключается в следующем:
·Создаются прототипы функций, имеющие те же параметры, что и необходимые функции внутри *. dll . Для нашего примера это будет выглядеть так:
typedef BOOL (WINAPI * Inc)(int i);
·Объявляется переменная типа указателя на данную функцию:
Inc pI ;
·В программе осуществляется загрузка библиотеки:
HINSTANCE hL;
hL=LoadLibrary("funlib.dll");
·объявленному указателю на функцию присваивается адрес функции из *. dll :
pI=(Inc)GetProcAddress(hL,(LPCSTR)2);
·Функция используется по назначению:
cout<<pI(6);
·После использования выгружается из памяти:
FreeLibrary(hL);
Целиком рассмотренный пример выглядит следующим образом:
#include "stdafx.h"
– 103 –
#include "iostream.h"
#include "windows.h"
HINSTANCE hL;
typedef int (CALLBACK * Inc)(int i);
Inc pI;
int main(int argc, char* argv[])
{ hL=LoadLibrary("1111.dll");
pI=(Inc)GetProcAddress(hL,(LPCSTR)2);
cout<<pI(6);
FreeLibrary(hL);
return 0;
}
Наличие *. dll требуется только во время запуска *. exe файла.
ЛЕКЦИЯ 10. ПРЕДСТАВЛЕНИЕ ГРАФИЧЕСКОЙ ИНФОРМАЦИИ
Битовые образы.
Битовые или растровые образы ( bitmap ) представляют собой метод хранения графической информации в программах для Windows . Битовый образ – это цифровое представление изображения. Каждому пикселю (точке) изображения соответствует один или более бит битового образа, которые определяют цвет пикселя. Таким образом, если, например, нам необходимо запомнить монохромное (черно-белое) изображение, мы можем использовать только один бит (0-черный, 1-белый) для запоминания одной точки рисунка. Битовые образы имеют как достоинства, так и недостатки. К достоинствам можно отнести хорошую передачу изображения (именно они чаще всего используются для хранения фотографий, сложных рисунков), ограниченную только воспроизводящим оборудованием (видео картой и монитором) цветовую гамму. Существенными недостатками является большой объем памяти для хранения и сложные алгоритмы преобразования битовых образов при выводе на конкретное устройство отображения (масштабирование, соответствие реальной и доступной цветовых гамм и т.п.).
Дата добавления: 2016-11-22; просмотров: 1037;