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), получил практические навыки по созданию динамических библиотек.


 

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

7679. Форми побудови дільниць, цехів та служб підприємства 37.95 KB
  Під виробничою структурою цеху розуміють складу входять до нього виробничих ділянок, допоміжних та обслуговуючих підрозділів, а також звязки між ними. Ця структура визначає розподіл праці між підрозділами цеху, тобто внутріцехове спеціалізацію и кооперирование производства...
7680. Складське господарство 19.5 KB
  Складське господарство Умовою безперервного перебігу виробничих процесів на підприємствах є створення певних запасів сировини, матеріалів, палива, комплектувальних виробів, а також міжцехових і внутрішньоцехових запасів напівфабрикатів власного виго...
7681. Матеріально-технічне забезпечення виробництва 19.41 KB
  Матеріально-технічне забезпечення виробництва МТЗ - це вид комерційної діяльності щодо забезпечення матеріально-технічними ресурсами процесу виробництва, здійснюваної, як правило, до початку виробництва. Основна мета МТЗ - доведення матері...
7682. Нормування праці 19.21 KB
  Нормування праці Нормування праці - це від діяльності з управління підприємством, пов’язаний з визначенням необхідних затрат праці та її результатів, контролем за мірою праці. Мета нормування праці в ринкових умовах полягає в тому, щоб на ...
7683. Призначення та класифікація нормативів праці 61.25 KB
  Призначення та класифікація нормативів праці. Під час нормування праці важливим завданням є забезпечення більш-менш рівної інтенсивності праці на різних за змістом та складністю роботах. Це досягається використанням єдиної методологічної (зага...
7684. Компенсаторно-приспособительные процессы 50 KB
  Компенсаторно-приспособительные процессы Определение. Приспособление (адаптация) - это процессы, с помощью которых организм реагирует на изменения условий жизни. Компенсация - это вид приспособления (адаптации) для восстановления нар...
7685. Опухоли системы крови (гемобластозы) 53.5 KB
  Опухоли системы крови (гемобластозы) Гемобластозы - опухолевые процессы кроветворной ткани. Разделяют две группы гемобластозов: лейкозы (лейкемия) - системные опухолевые заболевания кроветворной ткани. лимфомы - регионарны...
7686. Онкология. Теоретические особенности 49 KB
  Онкология Опухоль (tumor, neoplasma, blastoma) - патологический процесс, характеризующийся бесконтрольным размножением и ростом клеток, что связано с изменениями в генетическом аппарате клеток. Свойства опухоли: автономный рост опухоли...
7687. Эпителиальные органоспецифические опухоли 41 KB
  Эпителиальные органоспецифические опухоли Определение. Органоспецифические опухоли - это большая группа доброкачественных и злокачественных опухолей, которые развиваются только в определенном органе или происходят из клеток определенного органа...