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

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

Войти
Регистрация
Восстановить пароль
 
Stason676
Заблокирован
#1

Класс в dll - C++

21.11.2013, 10:54. Просмотров 598. Ответов 3
Метки нет (Все метки)

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
#include <iostream>
 
//файл Errors.h
 
#ifdef ERRORS_DLL
#define ERRORS_DLL __declspec(dllexport)
#else
#define ERRORS_DLL __declspec(dllimport)
#endif
 
/*Состояние автомата.
STA-начало строки, END-конец строки, OPR-операнд, 
BIO-бинарный знак операции, SQR-квадратный корень,
MIN-минус, LP-левая скобка, RP-правая скобка,
BAD-символ не опознан. state-текущее состояние,
memory-предыдущее состояние.*/
enum State { STA, END, DIG, ALF, BIO, SQR, MIN, LP, RP, BAD};                   
 
class ERRORS_DLL Errors
{
private:
        
    /*state-текущее состояние, prevState-прошлое состояние
    varState-состояние переменной.*/
    State state, prevState, varState;
 
    //true если цифра.
    bool IsDigit(char);
 
    //true если буква.
    bool IsAlpha(char);
 
    //true если оператор бинарный.
    bool IsBinOp(char);
 
    //Парсер
    State Parser(char);
 
public:
 
    //Конструктор.
    Errors();
 
    //Поиск недопустимых последовательностей во входящей строке.
    char* BadChain(char*);
 
    //Исключение если в строке обнаружены ошибки.
    class BadExpression
    {
    public:
        
        char* message;
 
        BadExpression()
        {
            message = "EXCEPTION.Expression is not accepted.";
        }
    };
};
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//файл Errors.cpp
 
#include "Errors.h"
 
//true если цифра.
bool Errors::IsDigit(char ch)
{
    char table[] = { '0','1','2','3','4','5','6','7','8','9','.','\0' };
 
    for(int i = 0; table[i]; ++i)
        if(ch == table[i])
            return true;
    
    return false;
}
 
//true если буква.
bool Errors::IsAlpha(char ch)
{
    char table[] = 
    {  
        'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i',
        'J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r',
        'S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','\0'
    };
 
    for(int i = 0; table[i]; ++i)
        if(ch == table[i])
            return true;
 
    return false;
}
 
//true если оператор бинарный.
bool Errors::IsBinOp(char ch)
{
    char table[] = { '*', '/', '+', '\0' };
 
    for(int i = 0; table[i]; ++i)
        if(ch == table[i])
            return true;
 
    return false;
}
 
//Парсер
State Errors::Parser(char ch)
{
    if(IsDigit(ch)) state = DIG;
    else if(IsAlpha(ch)) state = ALF;
    else if(IsBinOp(ch)) state = BIO;
    else if(ch == '^') state = SQR;
    else if(ch == '-') state = MIN;
    else if(ch == '(') state = LP;
    else if(ch == ')') state = RP;
    else if(ch == ';') state = END;
    else state = BAD;
        
    return state;
}
 
//Конструктор.
Errors::Errors()
{
    //Запись в память автомата положение старт.
    prevState = STA;
    varState = STA;
}
 
//Поиск недопустимых последовательностей во входящей строке.
char* Errors::BadChain(char* exp)
{
    //Выражение не должно превышать 256 символов.
    if(strlen(exp) > 255) throw BadExpression();
 
    char* workStr = new char[strlen(exp) + 2];
    strcpy(workStr, exp);
    
    //Замена зарезервированного символа ';' на '@'.
    for(unsigned i = 0; workStr[i]; ++i)
        if(exp[i] == ';')
            exp[i] = '@';
 
    //Вcтавить в конец строки ';' чтобы переключть автомат в стстояние "END".
    workStr[strlen(exp) + 1] = ';';
    workStr[strlen(exp) + 2] = 0;
 
    for (unsigned i = 0; workStr[i]; ++i)
    {
        switch(Parser(workStr[i]))
        {
            case END:
                switch(prevState)
                {
                    case STA: case BIO:
                    case SQR: case MIN:
                    case LP: throw BadExpression();
                }
                break;
            case DIG:
                if(prevState == RP) throw BadExpression();
                if(varState == STA) varState = DIG;
                prevState = DIG;
                break;
            case ALF:
                if(prevState == RP) throw BadExpression();
                if(varState == DIG) throw BadExpression();
                prevState = ALF; varState = ALF;
                break;
            case BIO:
                switch(prevState)
                {
                    case STA: case BIO:
                    case SQR: case MIN:
                    case LP: throw BadExpression();
                }
                prevState = BIO; varState = STA;
                break;
            case SQR:
                switch(prevState)
                {
                    case DIG: case ALF:
                    case BIO: case SQR:
                    case MIN: throw BadExpression();
                }
                prevState = SQR; varState = STA;
                break;
            case MIN:
                switch(prevState)
                {
                    case BIO: case SQR:
                    case MIN: throw BadExpression();
                }
                prevState = MIN; varState = STA;
                break;
            case LP:
                switch(prevState)
                {
                    case DIG: case ALF:
                    case RP: throw BadExpression();
                }
                prevState = LP; varState = STA;
                break;
            case RP:
                switch(prevState)
                {
                    case STA: case BIO:
                    case SQR: case MIN:
                    case LP: throw BadExpression();
                }
                prevState = RP; varState = STA;
                break;
            case BAD: throw BadExpression();
        }
    }
    //char* massege = "Expression accepted";
    return "Expression accepted";
}
Предупреждение 2 warning C4273: Errors::IsAlpha: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 17
Предупреждение 3 warning C4273: Errors::IsBinOp: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 34
Предупреждение 1 warning C4273: Errors::IsDigit: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 5
Предупреждение 4 warning C4273: Errors::Parser: несовместимая компоновка dll c:\documents and settings\admin\мои документы\visual studio 2010\projects\dll_test\dll_test\errors.cpp 46

VS предупреждает как исправить? Спасибо.

Добавлено через 15 часов 30 минут
C++
1
2
3
4
5
#ifdef ERRORS_DLL
#define ERRORS_DLL __declspec(dllexport) //Поменял местами эти
#else
#define ERRORS_DLL __declspec(dllimport) //две строчки и все заработало
#endif
Пожалуйста объясните почему или ссылку на подробное понятное описание. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2013, 10:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс в dll (C++):

Импортировать класс из dll - C++
Хай. У меня есть dll #include &quot;stdafx.h&quot; #include &lt;Windows.h&gt; #include &lt;iostream&gt; using namespace std; extern &quot;C++&quot;...

Передать в DLL указатель на класс - C++
В основной программе хочю сделать чтото типа class fprognoz { public: double End_chen; int rezult; __int64 ...

Как импортировать и экспортировать из dll класс? - C++
Помогите, плз. Создал dll: //... class __declspec(dllexport) a { public : a(); }; a::a() {

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Отдельно класс данных, класс формул и главный класс - C++
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

3
newbie666
Заблокирован
21.11.2013, 11:17 #2
а что такое ERRORS_DLL в объявлении класса ?
тфу ты зелёным шрифтом то и не заметил )) ща расскажу

Добавлено через 2 минуты
сразу уточню, что вы конкретно хотите экспортировать из DLL ?

Добавлено через 12 минут
В общем ты же собирался экспортировать функции и класс? У тебя не правильно написаны ifdef-ы, забей на макросы и пиши явно объявление класса так: class __declspec(dllexport) Errors.
P.S.: в 2012-й студии у тебя ещё один error будет по поводу безопасности strcpy:
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
ну в общем ты понял
1
Stason676
Заблокирован
29.11.2013, 09:39  [ТС] #3
мне просто интересно что конкретно делает этот макрос
0
newbie666
Заблокирован
29.11.2013, 11:20 #4
Цитата Сообщение от Stason676 Посмотреть сообщение
мне просто интересно что конкретно делает этот макрос
ну хочу копипастить сюда текст статьи - вот по русский всё коротко и ясно про ипорт и экспорт макросы - http://citforum.ru/book/cook/dll0.shtml

Добавлено через 1 минуту
а это ERRORS_DLL - твоё собственное объявление
1
29.11.2013, 11:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2013, 11:20
Привет! Вот еще темы с ответами:

Добавление своей dll в список dll подгружаемых процессом чужого процесса - C++
Вообще вопрос такой,как можно внедрить свою dll в список Import чужого не запущенного процесса?Не изменяя структуры файла.

Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL - C++
День добрый! При запуске моей программы (много моего кода + много разных сторонних dll) на WinXP SP2, получаем соответствующую ошибку...

Как узнать путь к загруженной DLL из самой DLL? - C++
Создаю небольшую программку в папке c:/test/app/, есть DLL в папке c:/test/dll/. В коде самой dll, после её подгрузки в программу, можно...

Запись из внедренной dll в другую dll этого процесса - C++
main.cpp #include &lt;Windows.h&gt; extern int writeprocess(); DWORD WINAPI MainThread(LPVOID lpParam) { ...


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

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

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