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

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

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

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

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

Добавлено через 6 минут
Ойойойой ОПЕЧАТАЛСЯ!
а не подскажете, что конкретно делает директива импорта __declspec(dllexport) ?
тут я хотел спросит не про export, а про __declspec(dllimport)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
14.08.2014, 21:28     Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций? #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 {
...
};
Brendon
Заблокирован
14.08.2014, 21:38  [ТС]     Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций? #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если коротко - она помечает данные как импортируемые из библиотеки.
всё это я знаю, но вот только если я подгружаю динамический при помощи LoadLibrary, то все эти импорты вообще не нужны.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 22:04     Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
14.08.2014, 22:04     Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций? #10
Цитата Сообщение от Brendon Посмотреть сообщение
если я подгружаю динамический при помощи LoadLibrary, то все эти импорты вообще не нужны
Правильно, не нужны.
В чем тогда вопрос, если ты сам все знаешь?

Добавлено через 5 минут
Цитата Сообщение от Brendon Посмотреть сообщение
Цитата Сообщение от Убежденный Посмотреть сообщение
Требования выглядят противоречиво...
почему же ?
Потому что с одной стороны хочешь без телодвижений пользоваться классом из dll, а c другой затеял динамическую загрузку
В твоем случае лучше все-таки сделать фабричную функцию, которая будет создавать нужный объект класса и ее уже экспортировать из dll. Класс при этом все равно должен быть экспортируемым.
Yandex
Объявления
14.08.2014, 22:04     Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций?
Ответ Создать тему
Опции темы

Текущее время: 03:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru