69995

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

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

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

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

Русский

2014-10-13

63 KB

7 чел.

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

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

Кафедра ЭВМ

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


 

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

82517. Понятие, формирование и распространение романо-германской правовой семьи 27.53 KB
  К романогерманской правовой семье относятся правовые системы возникшие в континентальной Европе на основе римских канонических и местных правовых традиций. Романогерманская правовая семья это правовые системы созданные с использованием римского правового наследия и объединенные общностью структуры источников права и сходством понятийноюридического аппарата Формирование. Романогерманская правовая семья имеет весьма длинную юридическую историю.
82518. Структура романо-германской правовой семьи 26.68 KB
  Основным источником является нормативный правовой акт. Правоприменительные органы также построены по иерархическому принципу. Правовое регулирование строится на принципе строго разделения публично и частноправовой сфер в зависимости от принадлежности правоотношения к той или иной сфере определяются права и обязанности субъектов права.
82519. Источники романо-германского права 26.8 KB
  Среди нормативно-правовых актов главное место занимает закон. Среди законов наибольшей юридической силой обладают конституции. Затем следуют органические (конституционные) законы, которые, однако, существуют не во всех странах этой семьи.
82520. Задания, направленные на развитие логического мышления младших школьников с ЗПР 61.5 KB
  Примеры такого анализа: Данное упражнение можно использовать на уроках математики. Данное упражнение рекомендуется использовать на уроках математики ознакомления с окружающим миром а также труда 2. Упражнение можно использовать на уроках математики. Это задание рекомендуется использовать на уроках математики ознакомления с окружающим миром и труда.
82521. Развитие мышления у детей с ЗПР младшего школьного возраста 35.5 KB
  Особый интерес представляет метод обучения детей модельному конструированию разработанный А. Важным при таком способе обучения конструированию является то что мыслительные процессы детей приобретают опосредованный характер нежели при конструировании по образцу. Для этого необходим достаточно высокий уровень абстрагирования что дает возможность формированию у детей специфических способов соотнесения определенных свойств условий с соответствующими свойствами постройки.
82522. Развитие мышления у младших школьников с ОНР 4.26 MB
  Отгадывание ребусов: отгадать слово из двух предлогов: найти в слове квас три предлога: Цель: развитие словеснологического мышления Установление простых аналогий навыков словообразования. Цель: развитие словеснологического мышления устойчивости и концентрации слухового внимания. Задание: определить что пропущено в рассказе: названия предметов предлоги или названия признаков Цель: развитие нагляднообразного мышления.
82523. Методы и приемы развития словесно-логического мышления учащихся с речевой патологией на уроках 83.5 KB
  Инструкция: Я буду говорить слово по звукам слогам а ты запиши его в тетради. а сани солома зэркало дворэц б первый слогпу третий слог вик второй слог хо; первый слог пу третий слог ка второй слогшин второй слог шок первый слог пу третий слог ка второй слог пуш первый слого Дополнительное задание: подчеркнуть лишнее слово. первый слог са второй слог мо третий слог кат третий слог ле второй слог то первый слог вер первый слог са третий слог ник...
82524. Дидактические игры и упражнения, направленные на развитие мышления у детей с умственной отсталостью дошкольного возраста 100.5 KB
  Педагог просит ребенка отнести на один стул такие указательный жест а на другой такие. Педагог дает одному из детей коробку с круглой прорезью а другому с квадратной и ставит условие: отобрать сразу все что можно протолкнуть в данную коробку. Если он выбирает правильно например шары но берет не все а только один или два шара педагог напоминает ему что нужно взять все такие указывает на шары. После того как дети отберут и бросят в прорези коробок нужные формы педагог подводит итог: Правильно Таня собрала все шары и...
82525. Игры для развития мышления и воображения у детей дошкольного возраста с нарушением слуха 88.5 KB
  Педагог просит: Достань тележку. Если ребенок вытянул тесьму то педагог вставляет ее снова обязательно за экраном. Если все же ребенок не сумел сделать сам педагог медленно показывает. Педагог предлагает детям выложить из своих фишек узоры по картинке.