Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033

Классы в dll

22.05.2013, 23:12. Показов 10341. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа как можно поместить свой класс в dll и потом использовать этот класс в своей программе ?
Примного благодарен буду за разъеснение ,маленький пример или полезную ссылку (даже придставить не могу как это сделать , да ещё и при экспорте не потерять истинное имя т.к. EXTERN _C не подайдёт т.к. в языке "С" нет же классов), вообщем всем заранее огромное спасибо !!!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.05.2013, 23:12
Ответы с готовыми решениями:

Классы в DLL
Здравствуйте. Можете объяснить с точки зрения памяти, почему экспорт классов запрещен в DLL? Долго искал, как это сделать, понял, что,...

Повторяющиеся классы в DLL
Вот совет нужен. К примеру есть две либы - динамическая B.DLL и стат. A.LIB. А.LIB динамически загружает B.DLL (Ну с помощью...

Библиотека Dll, модули и классы!
Ребята, всем привет! Предупреждаю сразу: я новичок в программировании, поэтому не кидайтесь помидорами. А вопрос у меня следующий: есть dll...

42
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
23.05.2013, 22:31  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
или так:
Код C++
1
obj.Show();
вот так
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.05.2013, 22:40
так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "dll.h"
 
using namespace std;
 
int main(int argc, char *argv[])
{
     
    
    LoadLibrary("Project1.dll");
    DllClass obj;
 
    obj.Show();
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
23.05.2013, 23:06  [ТС]
так только при компиляции вот такие ошибки , не о чём тебе не говорят ?
[Linker error] undefined reference to `_imp___ZN8DllClassC1Ev'
[Linker error] undefined reference to `_imp___ZN8DllClass4ShowEv'
[Linker error] undefined reference to `DllClass::~DllClass()'
[Linker error] undefined reference to `DllClass::~DllClass()'
C:\Users\ì\Desktop\Íîâàÿ ïàïêà\main.o(.text+0x77) ld returned 1 exit status
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
23.05.2013, 23:10  [ТС]
и вот что показывает Total commander по поводу экспорта , не наводит не на какую мысль ?
Миниатюры
Классы в dll  
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.05.2013, 23:13
Цитата Сообщение от Игорь с++ Посмотреть сообщение
так только при компиляции вот такие ошибки , не о чём тебе не говорят ?
Ну и всё, значит, суши вёсла. Линкёр не может найти ни конструктора ни деструктора, ни Show.
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
23.05.2013, 23:16  [ТС]
правельно , потому что их нии имена в dll экспортируются через ж......пу ! А в библиотеке всё норм . Понимаешь о чём я ?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.05.2013, 23:19
Цитата Сообщение от Игорь с++ Посмотреть сообщение
правельно , потому что их нии имена в dll экспортируются через ж......пу !
нет, нет поэтому. Смотри, ты пишешь:

C++
1
obj.Show();
А этой функции нет. Вообще. ПОД КАКИМ БЫ ТО НИ БЫЛО ИМЕНЕМ. Вот поэтому и ругань.
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
23.05.2013, 23:24  [ТС]
короче смотри
1) компилим при помощи dll , смотри скрин - 1(не фига не получается)
2) добавляем линкеру библиотеку которая создалась вместе с dll , смотри скрин -2
3) запускаем и о ЧУДООООО , с библиотекой всё прекрасно работает , вот почему же он с dll то не пашет !!!!!!!!!
Миниатюры
Классы в dll   Классы в dll   Классы в dll  

0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
23.05.2013, 23:28  [ТС]
короче ладно , если через dll не выходит , буду делать через библиотеку
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.05.2013, 23:36
Ты чё как с луны свалился-то? Ситуация самая обычная. Возьми какую-нибудь gdi-функцию и скомпиль без подключения *.a- файла, будет такая же ругань- типа линкёр не может ни хрена найти функцию. Потом добавь -l gdi.a и всё скомпилится.

То же самое и здесь. Первый случай- линкёр не может найти функцию и ругается. Второй случай- линкёр МОЖЕТ найти функцию и не ругается. Вот такие они, линкёры, требуют файлы *.a. Кстати, во втором скриншоте динамическая загрузка библиотеки абсолютно лишняя, ага. Не веришь- просто убери строку Load..., всё равно всё сработает. Ибо эта библиотека УЖЕ ПОДГРУЖЕНА. Ибо файл *.a...

Добавлено через 1 минуту
И чё за фигня, почему у тебя DEV не русифицирован?
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
23.05.2013, 23:43  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Не веришь- просто убери строку Load..., всё равно всё сработает.
я это и так знаю , просто забыл её закомментировать.

Цитата Сообщение от kravam Посмотреть сообщение
И чё за фигня, почему у тебя DEV не русифицирован?
русифицированная , просто у меня язык выбран английский , а что ?

Добавлено через 2 минуты
Всё , что ты написал со сравнением с gdi функциями я это и так знаю , просто хотелось бы , что бы как с библиотекой так же и с dll работало . Хотя ладно я уже забил , работает с библиотекой и пускай дальше себе работает.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
23.05.2013, 23:45
Ну так и всё, вопрос решён я считаю. Ответ только один- вот такие они, линкёры. Сам же понимаешь, *.a файл что-то привносит в компиляцию. Что же? Ну, наверное, благодаря ему как-то линкёр узнаёт адрес функции-метода и связывает её тело с её вызовом ассемблерным оператором перехода.

А если *.a нет, да ещё и тело функции не понять где, естественно, будет ругань. Всё предсказуемо.

Добавлено через 1 минуту
Цитата Сообщение от Игорь с++ Посмотреть сообщение
Всё , что ты написал со сравнением с gdi функциями я это и так знаю , просто хотелось бы , что бы как с библиотекой так же и с dll работало .
Ну тогда ты должен понимать, что для линковки необходимо тело функции, а его нет.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33456 / 21556 / 8248
Регистрация: 22.10.2011
Сообщений: 37,009
Записей в блоге: 12
24.05.2013, 05:14
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Игорь с++, ну я же дал ссылку, там ясно написано, что реализация с классом - наивная, реализуй интерфейсом. Это несложно:

1. DLL-ка:

Хидер
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
#ifndef __MAIN_H__
#define __MAIN_H__
 
#include <windows.h>
 
/*  To use this exported function of dll, include this header
 *  in your project.
 */
 
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif
 
 
#ifdef __cplusplus
 
class DLL_EXPORT IMyClass
{
public:
    IMyClass();
    virtual void Show() = 0;
    virtual ~IMyClass() = 0;
};
 
typedef IMyClass *ClassPointer;
 
#endif
 
extern "C" DLL_EXPORT ClassPointer WINAPI ClassCreate();
 
#endif // __MAIN_H__
CPP
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
#include "main.h"
#include <iostream>
 
IMyClass::IMyClass()
{
}
IMyClass::~IMyClass()
{
}
 
class DLL_EXPORT MyClass : public IMyClass
{
public:
    MyClass() : IMyClass()
    {
    }
    virtual ~MyClass()
    {
    }
    void Show();
};
 
DLL_EXPORT ClassPointer WINAPI ClassCreate()
{
    return new MyClass();
}
 
void MyClass::Show()
{
    std::cout << "Hello World !!!\n";
}
 
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;
 
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
 
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
 
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}


2. Тестирующая программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "main.h"
 
using namespace std;
 
int main()
{
    HINSTANCE hlib = 0;
    hlib = LoadLibrary("dll_gcc_class.dll");
    typedef ClassPointer (WINAPI* f)();
 
    f p = (f)GetProcAddress(hlib, "ClassCreate@0"); // имя - из DEF-файла
    IMyClass *pClass = p();
    if(pClass)
    {
        pClass->Show(); // или тебя и это не устраивает?
        delete pClass;
    }
    return 0;
}
1
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
24.05.2013, 12:14  [ТС]
UI, Спасибо огромное , как ВСЕГДА выручили .
Просто я как то не совсем понял из ссылки
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
24.05.2013, 18:25
бр-р-р... Ты чё, будешь в def-файле ковыряться?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33456 / 21556 / 8248
Регистрация: 22.10.2011
Сообщений: 37,009
Записей в блоге: 12
24.05.2013, 19:09
Ну да, некоторым в OLE - ковыряться не надо, понадобилось в DEF-файле посмотреть одну-единственную функцию, создающую экземпляр класса - тоже не надо, надо кнопку "Пыщь, чтобы все круто!!! Трах-тибидах!!!"

Вот пока такой кнопки нет - будешь и в OLE, и в DEF-ах и в отладчике и вообще где угодно ковыряться, чтобы программы работали (и чтобы они работали правильно)
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
24.05.2013, 19:31
Угу. Ну это чисто для себя если. Такой код ни дать, ни показать никому. Ни спросить у кого.
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
24.05.2013, 22:45  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Вот пока такой кнопки нет - будешь и в OLE, и в DEF-ах и в отладчике и вообще где угодно ковыряться, чтобы программы работали (и чтобы они работали правильно)
Полностью согласен !
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.05.2013, 10:57
kravam, Спасибо большое. Теперь работает!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33456 / 21556 / 8248
Регистрация: 22.10.2011
Сообщений: 37,009
Записей в блоге: 12
25.05.2013, 12:33
Цитата Сообщение от kravam Посмотреть сообщение
Ну это чисто для себя если.
Это твое мнение. Показывают и ГОРАЗДО более корявый код, посмотри на свои посты... А уж сколько кода с использованием OLE и данных из DEF-ов используется в реальной (а не студенческой, и не академической, когда можно месяцами сидеть и думать, "а как же тут вот сделать более красиво? А то точек с запятыми слишком много") жизни - так это можно узнать только тогда, когда перестанешь писать HelloWorld-ы, и начнешь работать с реальными проектами...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2013, 12:33

[Манул=Гайд=Статья]Классы и DLL
Многие новички которые не работали в сфере программирования и хотят сразу работать с C# задаются вопросами: Если весь код можно...

Как использовать классы dll в Visual C++
Если есть dll, созданная скажем в VB и содержащая класс(форма), то как использовать этот класс в VC++?

Нужны классы для архивации из Ionic.dll
У кого есть классы из Dll - Ionic.zip( желательно конечно именно функцию для архивации).. Можно и другие классы, если поделитесь).. ...

Как подключить классы из dll библиотеки, созданную в С# в программу?
Как подключить классы из dll библиотеки, созданную в С# в программу?

Можно ли вынести классы сгенерированные Entity Framework в отдельную dll?
Дорогие форумчане, прошу у вас помощи Пишу сейчас небольшое клиент-серверное приложение на C# На сервере установлен MS SQL Server и для...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru