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

Ответ
 
Опции темы
Старый 28.04.2010, 23:54   #1
Читер-спонсор
 Пехотинец
Аватар для -=Angel=-
 
-=Angel=- неизвестен в этих краях-=Angel=- неизвестен в этих краях
Регистрация: 18.04.2009
Сообщений: 74
Популярность: -165
Сказал(а) спасибо: 19
Поблагодарили 221 раз(а) в 76 сообщениях
Отправить сообщение для -=Angel=- с помощью ICQ
 
По умолчанию Создание и использование 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)
PHP код:
#ifndef _DLLTEST_H_
#define _DLLTEST_H_ 

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

extern "C" __declspec(dllexportvoid NumberList();
extern "C" __declspec(dllexportvoid LetterList(); 

#endif 
Код библиотеки (DLLTEST.CPP)
PHP код:
#include "dlltest.h" 
#define MAXMODULE 50 
char module[MAXMODULE]; 
extern "C" __declspec(dllexportvoid NumberList() 
{
GetModuleFileName(NULL, (LPTSTR)moduleMAXMODULE);
cout << "nnThis function was called from "
<< module 
<< endl << endl;
cout << "NumberList(): ";
for(
int i=0i<10i++) 
{
cout << << " ";
}
cout << endl << endl;

extern "C" __declspec(dllexportvoid LetterList() 
{
GetModuleFileName(NULL, (LPTSTR)moduleMAXMODULE);
cout << "nnThis function was called from "
<< module 
<< endl << endl;
cout << "LetterList(): ";
for(
int i=0i<26i++) 
{
cout << char(97 i) << " ";
}
cout << endl << endl;


Как видитеничего особенного в коде нетПриложениеиспользуемое для примера консольноетак что здесь просто запрограммированы две функциивыводящие текстСтрока

Цитата
:#include <conio.h>
#include <dlltest.h> 

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

getch();

Это будет прекрасно работать, если у вас есть заголовочный файл и библиотека импорта (dlltest.lib) находится в каталоге, прописанном в библиотечных путях. Перед запуском приложения, убедитесь, что DLL находится в каталоге, прописанном в системной переменной PATH или в том же каталоге, что и исполняемый файл, иначе вы получите сообщение об ошибке. Однако если 10 программ используют эту DLL, вам нужна всего одна ее копия, лежащая, например, в каталоге WindowsSystem.

Результаты работы DLLRUN01.EXE

PHP код:
This function was called from C:DLLTESTDLLRUN01.EXE
NumberList
(): 0 1 2 3 4 5 6 7 8 9 
This 
function was called from C:DLLTESTDLLRUN01.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)
PHP код:
#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)modMAXMODULE);
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
PHP код:
Library loadedC:DLLTESTDLLTEST.DLL 

This 
function was called from C:DLLTESTDLLRUN02.EXE
NumberList
(): 0 1 2 3 4 5 6 7 8 9 
This 
function was called from C:DLLTESTDLLRUN02.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.

(с) hacker-pro
  Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
geny (26.05.2011), HellFire (29.04.2010), reraider (13.03.2011)
Ответ


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
visual custom kick ™ 24E (HOT) TakeThat Warcraft 3 0 27.04.2010 06:57
Проблема с установкой Visual C++ Silence Вопросы и ответы, обсуждения 18 10.12.2009 23:17
Установка IDE и первая программа на Visual C++ Ivan_32 С/С++ 1 29.11.2008 00:53
Visual Custom Kick v v3.5.0 maxxx Warcraft 3 0 07.11.2008 21:28

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

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

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net