С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dark Illusion
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 31
#1

Работа с DLL библиотеками - C++

22.02.2013, 01:00. Просмотров 919. Ответов 5
Метки нет (Все метки)

Здравствуйте. Помогите, пожалуйста, переделать программу.
Определите следующие функции для работы с массивом:
1) int GetValue(Pairs* p, char* name, int* var); // получить значение для заданного имени (функция должна возвратить 0 если нет такого имени и 1 в случае успеха, а значение возвращать через второй параметр функции);
2) void SetValue(Pairs* p, char* name, int value); // установить значение для заданного имени (если такого имени в массиве нет, то добавить в массив новую пару);
3) void PrintPairs(Pairs* p); – вывод всех пар на экран.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <cstring>
#include <windows.h> 
struct Pair
{
    char* name; //имя
    int value;  //значение
};
 
#define MAX_PAIRS 100
 
struct Pairs
{
    Pair items[MAX_PAIRS];  //массив пар
    int count;              //количество пар в массиве
};
 
// создаёт в куче копию строки src и возвращает на неё указатель 
char* StrDup(const char* src)
{
    char* dest = new char[std::strlen(src) + 1];
    return std::strcpy(dest, src);
}
 
int GetValue(const Pairs *p, const char *name, int *var)
{ 
    for (int i = 0; i < p->count; i++)
    {
        // сравниваем строки с помощью функции strcmp(если она возвращает 0, то строки равны)
        if(std::strcmp(p->items[i].name, name) == 0)
        {
            // помещаем найденное значение в переменную адрес которой хранит переменная var
            *var = p->items[i].value; 
            
            // найдено
            return 1; 
        }
    }
    
    return 0; // не найдено
}
 
void SetValue(Pairs* p, const char* name, int value) 
{       
    for (int i = 0; i < p->count; i++)
    {
        // сравниваем строки с помощью функции strcmp(если она возвращает 0, то строки равны)
        // условие вида if(p->items[i].name == name) сравнит указатели(адреса), а не строки
        if (std::strcmp(p->items[i].name, name) == 0)
        {
            p->items[i].value = value; 
            return; // и никаких flag'ов
        }        
    }
    
    p->items[p->count].name = StrDup(name);
    p->items[p->count].value = value;
    p->count++;
}
 
void PrintPairs(const Pairs *p) 
{
    for (int i = 0; i < p->count; i++)
    {
        std::cout << p->items[i].name << " -> ";
        std::cout << p->items[i].value << "\n";
    }
}
 
void Init(Pairs *p)
{
    p->count = 0;
}
 
void Free(Pairs *p)
{
    for (int i = 0; i < p->count; i++)
        delete[] p->items[i].name;
}
 
int main ()
{
    Pairs d;
    Init(&d);
        
    SetValue(&d, "lolooo", 25);            
    SetValue(&d, "lol" , 40);    
    
    PrintPairs(&d);
    
    //-----
    
    int value;
    
    if(GetValue(&d, "lol", &value) == 0)    
        std::cout << "not found\n";        
    else    
        std::cout << value << "\n";    
    
    //-----
    
    SetValue(&d, "lol" , 10);        
    PrintPairs(&d);    
    
    Free(&d);
system("pause");
    return 0;
}
1) Функции, описанные выше, нужно оформить в виде библиотеки DLL;
2) Создать новый проект для демонстрации работы с DLL и функциями;
3) В первом варианте программы необходимо использовать динамическое связывание без импорта, во втором – статическое связывание с импортом;
4) при динамическом связывании необходимо в проекте с главной программой объявить указатели на функции, содержащиеся в DLL (см. пример решения ниже);
4) при статическом связывании необходимо создать специальный заголовочный файл с объявлениями функций (см. пример решения ниже);

Примеры решения:
1) Динамическое связывание:

Файл MyDate.cpp
C++
1
2
3
4
5
6
7
8
struct Date {
    //...
};
__declspec(dllexport) void GetDate(Date * d)
{
    //...
}
//...
Текст основной программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Date {
    //...
}
typedef void(__cdecl * PFGETDATE)(Date *);
//...
typedef void (__cdecl * PFWRITEDATE)(char *, Date *, int);
//...
void main()
{
    HANDLE hLibrary;
    PFGETDATE pfGetDate;
    //...
    Date dt;
    hLibrary = LoadLibrary("MyDate.dll");
    if (!hLibrary) return;
    pfGetDate = 
        (PFGETDATE)GetProcAddress(hLibrary,"GetDate");
    if (pfGetDate) pfGetDate(&dt);
 
    //...
    FreeLibrary(hLibrary);
}
2) Статическое связывание:

Заголовочный файл MyTime.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef MYLIBAPI
    #define MYLIBAPI __declspec(dllimport)
#endif
 
MYLIBAPI struct Time
{
    //...
};
MYLIBAPI void GetTime(Time *);
//...
void WriteTime(char *, Time *, int);
//...
 
Файл MyTime.cpp
 
#define MYLIBAPI    __declspec(dllexport)
#include "MyTime.h"
 
MYLIBAPI void GetTime(Time * t)
{
    //...
}
//...
Текст основной программы
C++
1
2
3
4
5
6
7
8
9
10
11
//укзание компоновщику, что при компоновке необходимо использовать MyTime.lib
#pragma comment(linker, "MyTime.lib")
 
#include "MyTime.h"
 
void main()
{
    Time t;
    GetTime(&t);
    //...
}
Помогите, пожалуйста, переделать программу, функции я описал, а с библиотеками ничего не получается. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 01:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с DLL библиотеками (C++):

С какими библиотеками .lib или .dll програмы работают быстрее? - C++
С какими библиотеками .lib или .dll програмы работают быстрее? и почему?

Какой необходим минимальный уровень знаний для работы с DLL-библиотеками? - C++
Какой нужно минимальный уровень знаний о dll-библиотеках, что бы адекватно с ними работать/их использовать? Мне посоветовали почитать...

Работа с библиотеками openCV - C++
Пытаюсь запустить код по распознаванию лиц, использующий библиотеки opencv. Все библиотеки были установлены в согласии с разными...

Создание и работа с динамическими библиотеками - C++
yfнаучите создовать и подключать dll или кинте доходчевую статью для болбесов компилятор dev c++ 4.9

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

Работа с DLL - C++
У меня такая проблема не могу экспортировать функцию с шаблоном без шаблона она без проблем работает. Название функции BubleSort. *.cpp ...

5
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.02.2013, 13:46 #2
Слишком много всего для одной темы. Разбейте на подтемы, и тогда, может быть, Вам помогут быстрее.
По первым пунктам непонятно, почему нельзя использовать стандартный тип string, чтобы не заморачиваться с new/delete.
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,164
Записей в блоге: 17
22.02.2013, 17:15 #3
Цитата Сообщение от Tulosba Посмотреть сообщение
По первым пунктам непонятно, почему нельзя использовать стандартный тип string, чтобы не заморачиваться с new/delete.
Потому что в стиле Си. Как к примеру использовать ф-цию с std::string в DLL из Delphi или другого языка ?

Добавлено через 2 минуты
Dark Illusion, А какие затруднения вообще учитывая что есть пример? Или вы думаете мы выполним вашу работу за вас ?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.02.2013, 17:24 #4
Цитата Сообщение от Avazart Посмотреть сообщение
Как к примеру использовать ф-цию с std::string в DLL из Delphi или другого языка ?
Экспортировать с char, а внутри dll использовать std::string
0
Dark Illusion
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 31
23.02.2013, 00:47  [ТС] #5
Не получается вообще ничего, ни разу не работал с библиотеками
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2013, 08:06 #6
Цитата Сообщение от Dark Illusion Посмотреть сообщение
Не получается вообще ничего, ни разу не работал с библиотеками
Значит надо изучить вопрос. Почитайте например тут.
0
23.02.2013, 08:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 08:06
Привет! Вот еще темы с ответами:

работа с dll - C++
помогите мне нужно при нажатии на кнопу в форме передать 2 переменые в длл, а в длл посчитать суму и передатьобратно в форму

Работа с DLL - C++
Всем доброго времени суток. Кто может подсказать как в DLL передать переменную, потом в DLL функция её обработает, и как после этого...

Работа с DLL Visual C++ - C++
Добрый день! Есть dll, но она без *.lib, как ей пользоваться если при требуется указывать *.lib ?

Ошибки с библиотеками - C++
Добрый день. Установил среду MS VS 2010 эксперт, сначала вообще не было библиотек. Он не находил ни &lt;iostream&gt; ни &lt;math.h&gt;. Затем пере...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.