Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

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

Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций? - C++

14.08.2014, 19:20. Просмотров 565. Ответов 9
Метки нет (Все метки)

Привет!
Есть DLL, экспортирую из неё класс, можно ли в коде, имея header (файл с описанием DLL-ки) этой DLL, создать экземпляр этого класса без вызова функций каких - то из DLL? Ведь обычно для таких целей в DLL делают глобальную функцию, с названием типа GetPointer, GetClass, GetApp, QueryInterface и т.д., которая возвращает указатель на созданный в DLL-ке экземпляр класса и потом уже в коде можно с ним работать, то есть загрузил DLL, получил адрес заранее известной функции, вызвал её и поскольку есть хидер файл - получил из void* то что нужно.
Может есть какой - то трюк, чтоб обойтись без всей этой свистопляски ? Конечно мне не сложно вызывать одну функцию - просто вопрос принципа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2014, 19:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций? (C++):

Создать объект внутри класса, который может вызывать функцию этого класса - C++
Ребята помогите уже несколько дней мучаюсь. Хочу сделать программу в консоле демонстрации работы лифта в здании 2 этажа. Сделал класс...

Объект класса без аргументов и с ними - C++
Доброго времени суток. Можно ли сделать так, чтобы: 1. объект класса, вызванный без аргументов, возвращал некое значение, которое в нем...

Создать экземпляр класса без явного указания членов класса - C++
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не могу создать экземпляр класса без явного...

Можно ли удалить объект экземпляра класса из самого себя? - C++
Привет! Допустим: class TEST { public: TEST(); ~TEST(); void DelMe() {

Как создать объект класса в потоке? - C++
Как создать объект класса в потоке? Это вообще возможно?

Можно ли в поле private сконструировать объект с параметрами другого класса? - C++
Например у меня есть классы Basic и Second. Во 2-м классе есть конструктор с параметрами. Можно ли написать что-то типу такого? class...

9
Убежденный
Системный программист
Эксперт С++
15633 / 7143 / 1130
Регистрация: 02.05.2013
Сообщений: 11,582
Записей в блоге: 1
Завершенные тесты: 1
14.08.2014, 19:21 #2
В Visual C++ классы можно экспортировать с помощью __declspec(dllexport).
1
Brendon
Заблокирован
14.08.2014, 19:23  [ТС] #3
Цитата Сообщение от Убежденный Посмотреть сообщение
В Visual C++ классы можно экспортировать с помощью __declspec(dllexport)
Да, я в курсе, но как это помогает использовать класс без доп функций?
Как можно в коде создать при помощи этого экземпляр класса ?
0
Убежденный
Системный программист
Эксперт С++
15633 / 7143 / 1130
Регистрация: 02.05.2013
Сообщений: 11,582
Записей в блоге: 1
Завершенные тесты: 1
14.08.2014, 19:23 #4
Самым прямым образом.
При таком экспорте никакие дополнительные функции не нужны.
0
Brendon
Заблокирован
14.08.2014, 19:31  [ТС] #5
Цитата Сообщение от Убежденный Посмотреть сообщение
При таком экспорте никакие дополнительные функции не нужны.
Ну как же так?
Я..быть может я забыл сказать, что DLL загружается динамический при помощи LoadLibrary, а не при помощи директивы import.
Вот подгрузил я DLL и единственное на мой взгляд, что я могу сделать - это вызвать GetProcAddress, чтоб получить адрес функции MySuperClass* GetClass(){ return new MySuperClass; } и получить уже указатель на класс... Разве не так ?
0
Убежденный
Системный программист
Эксперт С++
15633 / 7143 / 1130
Регистрация: 02.05.2013
Сообщений: 11,582
Записей в блоге: 1
Завершенные тесты: 1
14.08.2014, 19:41 #6
Цитата Сообщение от Brendon Посмотреть сообщение
Я..быть может я забыл сказать, что DLL загружается динамический при помощи LoadLibrary
Требования выглядят противоречиво...
Delayed import подойдет ?

http://msdn.microsoft.com/en-us/library/yx9zd12s.aspx
1
Brendon
Заблокирован
14.08.2014, 19:57  [ТС] #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Требования выглядят противоречиво...
почему же ?
Цитата Сообщение от Убежденный Посмотреть сообщение
Delayed import подойдет ?
не, не подойдёт, директива import вообще не работает в многопоточной компиляции в VisualStudio, а без ней никуда ...
Да и потом мне нужно иногда выгружать DLL-ку из памяти, подменять её на более новую и опять загружать, то есть всё в динамике.
Убежденный, а не подскажете, что конкретно делает директива импорта __declspec(dllexport) ?

Добавлено через 6 минут
Ойойойой ОПЕЧАТАЛСЯ!
а не подскажете, что конкретно делает директива импорта __declspec(dllexport) ?
тут я хотел спросит не про export, а про __declspec(dllimport)
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
14.08.2014, 21:28 #8
__declspec( dllexport ) используется при построении самой dll. __declspec( dllimport ) используется при компиляции программы, которая использует данное dll.

Если коротко - она помечает данные как импортируемые из библиотеки.

Из msdn:

Использование __declspec(dllimport) является необязательным при объявлении функций, хотя компилятор выдает более эффективный код, когда данное ключевое слово используется.
Видел примерно следующее использование;
C++
1
2
3
4
5
6
7
8
9
10
11
#ifdef BUILD_DLL
   #define DECLSPEC __declspec( dllexport )
#else
   #define DECLSPEC __declspec( dllimport )
#endif
 
DECLSPEC void f();
 
class DECLSPEC MyClass {
...
};
1
Brendon
Заблокирован
14.08.2014, 21:38  [ТС] #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если коротко - она помечает данные как импортируемые из библиотеки.
всё это я знаю, но вот только если я подгружаю динамический при помощи LoadLibrary, то все эти импорты вообще не нужны.
0
DrOffset
7320 / 4420 / 1001
Регистрация: 30.01.2014
Сообщений: 7,258
14.08.2014, 22:04 #10
Цитата Сообщение от Brendon Посмотреть сообщение
если я подгружаю динамический при помощи LoadLibrary, то все эти импорты вообще не нужны
Правильно, не нужны.
В чем тогда вопрос, если ты сам все знаешь?

Добавлено через 5 минут
Цитата Сообщение от Brendon Посмотреть сообщение
Цитата Сообщение от Убежденный Посмотреть сообщение
Требования выглядят противоречиво...
почему же ?
Потому что с одной стороны хочешь без телодвижений пользоваться классом из dll, а c другой затеял динамическую загрузку
В твоем случае лучше все-таки сделать фабричную функцию, которая будет создавать нужный объект класса и ее уже экспортировать из dll. Класс при этом все равно должен быть экспортируемым.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 22:04
Привет! Вот еще темы с ответами:

Можно-ли наследовать класс, в котором определен объект текущего класса? - C++
Подскажите, пожалуйста, можно-ли делать так: class A { public: B objB; }; class B : public A {};

Не получается создать объект унаследованный от абстрактного класса - C++
Здравствуйте! Нужна помощь с виртуальными функциями, в теории понимаю что это, а вот с реализацией что-то совсем не получается. ...

Как создать объект класса с двумя параметрами? - C++
#include <iostream> using namespace std; class rational{ public: rational(int numerator = 0, int denominator =...

Как создать объект класса в динамической памяти? - C++
привет. я так понял, можно создать объект в динамической области памяти. либо просто создать объект обычным способом, но чтобы его...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
14.08.2014, 22:04
Ответ Создать тему
Опции темы

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