69995

РАЗРАБОТКА ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫХ БИБЛИОТЕК

Лабораторная работа

Информатика, кибернетика и программирование

Цель: Ознакомление с одним из наиболее важным структурным элементом Windows - библиотеками динамической компоновки (Dynamic Link Libraries, DLL), получение практических навыков по созданию динамических библиотек.

Русский

2014-10-13

63 KB

2 чел.

Министерство образования и науки Украины

Харьковский Национальный Университет Радиоэлектроники

Кафедра ЭВМ

Лабораторная работа №7

Тема: «РАЗРАБОТКА ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫХ БИБЛИОТЕК»

Выполнил:                                                                      Проверил:

ст. гр. КИ-08-4                                                                Бугрий А. Н.

Кравец Артём Валерьевич

2009

Лабораторная работа №7

Цель: Ознакомление с одним  из наиболее важным структурным элементом Windows - библиотеками динамической компоновки (Dynamic Link Libraries, DLL), получение практических навыков по созданию динамических библиотек.

Задание:

Вариант 6

Создать динамически подключаемую библиотеку функций поиска минимума и максимума массива целых чисел (в функцию передается указатель на массив и число элементов массива). Использовать созданную DLL в другой программе.

Листинг:

// dll

    // funlib.h

#define EXPORT extern "C" __declspec(dllexport)

EXPORT int CALLBACK Max(int*, int);

EXPORT int CALLBACK Min(int*, int);

    // funlib.cpp

#include <windows.h>

#include <string.h>

#include "funlib.h"

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)

{

          return TRUE;

}

EXPORT int CALLBACK Min(int*mas,int n)

{

 int min, i;

min = mas[0];

 for(i=0;i<n;i++)

 if(mas[i]<min)

  min = mas[i];

 return min;

}

EXPORT int CALLBACK Max(int*mas,int n)

{

 int max, i;

max = mas[0];

 for(i=0;i<n;i++)

 if(mas[i]>max)

  max = mas[i];

 return max;

}

// main_proga

#include "stdafx.h"

#include "Laba3_dll.h"

#define MAX_LOADSTRING 100

const int n=8;

int mas[n], max, min;

// Глобальные переменные:

HINSTANCE hInst;        // текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING];     // Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING];   // имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:

ATOM    MyRegisterClass(HINSTANCE hInstance);

BOOL    InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

HWND hWnd;

HINSTANCE hL;

typedef int (CALLBACK * Min)(int*mas, int n);

Min FunMin;

typedef int (CALLBACK * Max)(int*mas, int n);

Max FunMax;

int APIENTRY _tWinMain(HINSTANCE hInstance,

                    HINSTANCE hPrevInstance,

                    LPTSTR    lpCmdLine,

                    int       nCmdShow)

{

srand((unsigned)time( NULL ));

 for(int i=0; i<n; i++)

 mas[i] = rand()%100;

hL=LoadLibrary("2.dll");

 if(hL == NULL)

 MessageBox(hWnd, "Не удалось подключить dll","Error", MB_OK);

   FunMax = (Max)GetProcAddress(hL,(LPCSTR)1);

FunMin = (Min)GetProcAddress(hL,(LPCSTR)2);

min = FunMin(mas,n);

max = FunMax(mas,n);

FreeLibrary(hL);

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

 // TODO: разместите код здесь.

MSG msg;

HACCEL hAccelTable;

 // Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_LABA3_DLL, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

 // Выполнить инициализацию приложения:

 if (!InitInstance (hInstance, nCmdShow))

{

 return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LABA3_DLL));

 // Цикл основного сообщения:

 while (GetMessage(&msg, NULL, 0, 0))

{

 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

 {

  TranslateMessage(&msg);

  DispatchMessage(&msg);

 }

}

 return (int) msg.wParam;

}

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style   = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra  = 0;

wcex.cbWndExtra  = 0;

wcex.hInstance  = hInstance;

wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LABA3_DLL));

wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_LABA3_DLL);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 return RegisterClassEx(&wcex);

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

  hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

  hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  if (!hWnd)

  {

     return FALSE;

  }

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  return TRUE;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

 int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

 static char str[30];

 static char str1[30];

 static char str2[30];

wsprintf(str,"Массив = %i %i %i %i %i %i %i %i",mas[0],mas[1],mas[2],mas[3],mas[4],mas[5],mas[6],mas[7]);

wsprintf(str1,"Mинимум массива - %i",min);

wsprintf(str2,"Максимум массива - %i",max);

 switch (message)

{

 case WM_COMMAND:

  wmId    = LOWORD(wParam);

  wmEvent = HIWORD(wParam);

  // Разобрать выбор в меню:

  switch (wmId)

  {

  case IDM_ABOUT:

   DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

   break;

  case IDM_EXIT:

   DestroyWindow(hWnd);

   break;

  default:

   return DefWindowProc(hWnd, message, wParam, lParam);

  }

  break;

 case WM_PAINT:

  hdc = BeginPaint(hWnd, &ps);

  TextOut(hdc, 50, 50, str, strlen(str));

  TextOut(hdc, 50, 75, str1, strlen(str1));

  TextOut(hdc, 50, 100, str2, strlen(str2));

  EndPaint(hWnd, &ps);

  break;

 case WM_DESTROY:

  PostQuitMessage(0);

  break;

 default:

  return DefWindowProc(hWnd, message, wParam, lParam);

}

 return 0;

}

// Обработчик сообщений для окна "О программе".

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

 switch (message)

{

 case WM_INITDIALOG:

 return (INT_PTR)TRUE;

 case WM_COMMAND:

 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

 {

  EndDialog(hDlg, LOWORD(wParam));

  return (INT_PTR)TRUE;

 }

 break;

}

 return (INT_PTR)FALSE;

}

Результат:

Выводы: В этой лабораторной работе я ознакомился с одним  из наиболее важным структурным элементом Windows - библиотеками динамической компоновки (Dynamic Link Libraries, DLL), получил практические навыки по созданию динамических библиотек.


 

А также другие работы, которые могут Вас заинтересовать

79802. Технология DVD в курсе мультимедиа лекций по дисциплине Компьютерная графика 8.37 MB
  Существует достаточно много интерактивных обучающих курсов, как правило, лабораторные работы, или различные виды материалов для дистанционного обучения. Особенностью данной работы является то, что подготовленный материал предназначается для очного образования и для потоковых лекций. Конечный продукт данной работы –DVD диск, который служит как вспомогательный материал для проведения лекций, но никак самостоятельный обучающий курс. Данный продукт повышает интерес студентов к читаемой дисциплине и повышает качество образовательного процесса.
79804. Создание общей дизайн-концепции полиграфии для Ивангородской детской музыкальной школы 1.55 MB
  Первый слой в файле – символ Ивангорода – крепость обернутая в клавиши фортепиано – прозрачное объяснение названия музыкальной школы – Ивангородская. Далее идет слой с текстом обтекающим лиру со всех сторон. Слой Lyer 12 находится ниже остальных и отвечает за нотный стан. Поскольку размер изображения очень большой первый слой был залит белым цветом а не оставлен прозрачным так как это визуально осложнило бы работу над элементами в целом.
79805. Создание интерактивного тренажера «Видеостудия» 4.24 MB
  Создание интерактивного тренажера «Видеостудия», необходимого для иллюстрирования лекционного материала, а так же для дополнения к практическим работам со средствами съемочной студии.
79806. Разработка устройства для измерения освещенности и коэффициента пульсации светового потока 4.02 MB
  Задача дипломного проекта заключается в разработке функциональной и принципиальной схем устройства, позволяющего произвести измерение освещенности в установленных пределах, а также коэффициента пульсации светового потока с погрешностью
79807. Разработка Программы-Робота для автоматического выполнения Биржевых операций с ценными бумагами 2.74 MB
  Разработка торгового робота (автомата), работающего в связке с торговой платформой QUIK, генерирующего сигналы для входа и/или выхода в короткие и/или длинные позиции, с возможностью установки стоп-заявок.
79808. Разработка программного средства криптографической защиты файлов и исследования современных подходов к построению блочных алгоритмов шифрования 3.45 MB
  В данной работе представлен обзор методов зашифрования и расшифрования файлов, методов аутентификации и противодействие атакам на зашифрованные данные. Приводится структура и тестирование рассматриваемого алгоритма шифрования, построенного на основе современных тенденций построения блочных алгоритмов шифрования.
79809. Фестиваль бардовской песни «Зелёные Сростки» 585 KB
  Открытие фестиваля. Итак цели исследования: Обобщение и систематизация теоретических и практических наработок в области режиссуры неофициальных элитарных празднеств на примере организации и режиссуры фестиваля АП; Исследование воздействия на сознание личности карнавальных ситуаций и методов воздействия ведущих к карнавализации сознания участников неофициальных празднеств.
79810. Розробка Web-сайту та бази даних Інтернет – магазину 3.58 MB
  Інтернет магазин - це реалізоване в мережі Інтернет представництво, шляхом створення Web-сервера для продажу товарів і послуг іншим користувачам мережі Інтернет. Інакше кажучи, Інтернет магазин - це співтовариство територіально розєднаних співробітників магазина (продавців, касирів) і покупців