Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 25.04.2013, 23:04   #1
 Разведчик
Аватар для pahen666
 
pahen666 неизвестен в этих краях
Регистрация: 06.10.2011
Сообщений: 2
Популярность: -58
Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 8 сообщениях
 
По умолчанию Создание и использование DLL

Создание и использование DLL (Microsoft Visual C++)


Введение

Создать DLL намного легче, чем вы думаете. Библиотеки DLL очень полезны, если вы программируете под Windows. В этих библиотеках обычно хранят часто используемые подпрограммы. В статье рассказывается как создать простую DLL и показано, как вызвать функции, содержащиеся в ней. Примеры расчитаны на использование Microsoft Visual C++ 6.0, но нетрудно перевести их на любой диалект C++.

Создание DLL

Ничего особенного здесь нет. Как обычно, вы просто пишите функции, как в обычной программе. Если вы используете MSVC, создайте новый проект и укажите, что вы создаете Win32 Dynamic-Link Library. После компиляции вы получите DLL, библиотеку импорта (.lib) и библиотеку экспорта (.exp).

Далее показан примерный код вашей DLL:
Цитата:
Заголовочный файл (DLLTEST.H)
#ifndef _DLLTEST_H_
#define _DLLTEST_H_

#include <iostream.h>
#include <stdio.h>
#include <windows.h>

extern "C" __declspec(dllexport) void NumberList();
extern "C" __declspec(dllexport) void LetterList();

#endif

Код библиотеки (DLLTEST.CPP)

#include "dlltest.h"
#define MAXMODULE 50
char module[MAXMODULE];
extern "C" __declspec(dllexport) void NumberList()
{
GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);
cout << "\n\nThis function was called from "
<< module
<< endl << endl;
cout << "NumberList(): ";
for(int i=0; i<10; i++)
{
cout << i << " ";
}
cout << endl << endl;
}
extern "C" __declspec(dllexport) void LetterList()
{
GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);
cout << "\n\nThis function was called from "
<< module
<< endl << endl;
cout << "LetterList(): ";
for(int i=0; i<26; i++)
{
cout << char(97 + i) << " ";
}
cout << endl << endl;
}

Как видите, ничего особенного в коде нет. Приложение, используемое для примера - консольное, так что здесь просто запрограммированы две функции, выводящие текст. Строка:
Цитата:
#include <conio.h>
#include <dlltest.h>

void main()
{
NumberList();
LetterList();

getch();
}

Это будет прекрасно работать, если у вас есть заголовочный файл и библиотека импорта (dlltest.lib) находится в каталоге, прописанном в библиотечных путях. Перед запуском приложения, убедитесь, что DLL находится в каталоге, прописанном в системной переменной PATH или в том же каталоге, что и исполняемый файл, иначе вы получите сообщение об ошибке. Однако если 10 программ используют эту DLL, вам нужна всего одна ее копия, лежащая, например, в каталоге Windows\System.
Результаты работы DLLRUN01.EXE
Цитата:
This function was called from C:\DLLTEST\DLLRUN01.EXE
NumberList(): 0 1 2 3 4 5 6 7 8 9
This function was called from C:\DLLTEST\DLLRUN01.EXE
LetterList(): a b c d e f g h i j k l m n o p q r s t u v w x y z

Использование DLL без библиотеки импорта
Теперь посмотрим, как загрузить DLL "на лету". Это нужно в случае, если не вы разрабатывали эту DLL и у вас нет заголовочного файла и библиотеки импорта.
Исходный файл приложения, использующего библиотеку DLL - консольное приложение Win32 (DLLRUN01.EXE)
Цитата:
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#define MAXMODULE 50
typedef void (WINAPI*cfunc)();
cfunc NumberList;
cfunc LetterList;
void main()
{
HINSTANCE hLib=LoadLibrary("DLLTEST.DLL");
if(hLib==NULL)
{
cout << "Unable to load library!" << endl;
getch();
return;
}
char mod[MAXMODULE];

GetModuleFileName((HMODULE)hLib, (LPTSTR)mod, MAXMODULE);
cout << "Library loaded: " << mod << endl;
NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList");
LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList");
if((NumberList==NULL) || (LetterList==NULL))
{
cout << "Unable to load function(s)." << endl;
FreeLibrary((HMODULE)hLib);
return;
}
NumberList();
LetterList();
FreeLibrary((HMODULE)hLib);
getch();
}

Этот код загружает DLL (если она находится в путях или в текущем каталоге), а затем определяет адреса функций, которые мы будем вызывать. Конечно, в этом случае пришлось написать намного больше кода, и, соответственно, придется отловить немало ошибок. Однако такой подход универсальней.
Цитата:
Результаты работы DLLRUN02.EXE
Library loaded: C:\DLLTEST\DLLTEST.DLL

This function was called from C:\DLLTEST\DLLRUN02.EXE
NumberList(): 0 1 2 3 4 5 6 7 8 9
This function was called from C:\DLLTEST\DLLRUN02.EXE
LetterList(): a b c d e f g h i j k l m n o p q r s t u v w x y z

Конечно, эти небольшие примеры далеки от реальных задач программиста, однако они вполне достаточны, чтобы понять основные принципы создания и использования DLL.
  Ответить с цитированием
Пользователь сказал cпасибо:
JKHKJgj (19.04.2015)
Старый 12.01.2014, 02:24   #2
Заблокирован
 Разведчик
Аватар для Artich2
 
Artich2 вызывает надежду
Регистрация: 08.02.2012
Сообщений: 7
Популярность: -44
Сказал(а) спасибо: 14
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание и использование DLL

мне кажется или во 2 примере слишком много лишнего текста?
кпримеру чтоб динамически загрузить длл(2 пример) нужно
#include <windows.h>
cfunc NumberList;
cfunc LetterList;
void main()
{
HINSTANCE hLib=LoadLibrary("DLLTEST.DLL");
if(!hLib)return;
NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList");
LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList");
}

ф-кции загружены
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Руководство] Создание и использование библиотеки DLL daff26 Разработка ПО для Point Blank 3 09.03.2012 00:33
Создание и использование DLL (Microsoft Visual C++) -=Angel=- С/С++ 0 28.04.2010 23:54

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 08:05.

Пишите нам: forum@zhyk.ru
Copyright © 2025 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net