Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Продолжение темы про DLL 
:(
    Опции темы
BraM's
Дата 6.7.2004, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



У меня получается (через extern "C") загружать из ДЛЛ-и функцию. А как мне теперь сделать так, чтобы оттуда же взять класс? Например, конструктор загрузить...
PM MAIL ICQ   Вверх
Олег М
Дата 6.7.2004, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Самое простое - создай в ДЛЛке класс и возврати указатель на него. Как в ОЛЕ.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 6.7.2004, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Можно импортировать из длл хоть целый класс. Пример можно посмотреть, если создать проект Win32 Dynamic-Link Library, выбрав "DLL, which exports some symbols".


--------------------
user posted image
PM MAIL WWW   Вверх
BraM's
Дата 7.7.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



mr.DUDA, пробовал... Но если потом начинать использовать эту длл, то он не экспортирует ничего.
PM MAIL ICQ   Вверх
BraM's
Дата 8.7.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 2.7.2004

Репутация: нет
Всего: 1



Ау. Кто-нибудь скажите как это сделать?
PM MAIL ICQ   Вверх
AndyY
Дата 8.7.2004, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



[b]BraM's[b]

Олег М дал тебе абсолютно правильный совет:
описываешь интерфейс класса так:

Код

//header.h
class my_interface
{
 virtual void release() = 0;
 virtual void do_something() = 0;
};


в dll пишешь реализацию:
Код

#include "header.h"
class my_implementation : public my_interface
{
 virtual void release(){delete this;}
 virtual void do_something()
 {
   MessageBox( 0, "I do something", 0, 0 );
 }
};


и функцию создания:
Код

__declspec (__dllexport)
my_interface *create_my_object()
{return new my_implementation;}


потом в проге юзаешь:
Код

#include "header.h"

my_interface *p=create_my_object();
p->do_something();
p->release();



--------------------
PM MAIL WWW   Вверх
mr.DUDA
Дата 8.7.2004, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



AndyY, позвольте с Вами не согласиться. Зачем идти обходными путями ? Ведь экспортировать класс из длл можно, просто объявив его (класс) в заголовочном файле, со спецификатором __declspec(dllexport):
Цитата
// Dll.h

#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define
DLL_API __declspec(dllimport)
#endif


//////////////////////////////////////////////////////////////////////////


class DLL_API CSomeClass
{
protected:
   
int  value;
   
public:
   
CSomeClass();
   
CSomeClass(int);

   
int GetValue();
};


В cpp-файле написать реализацию этого класса (никакого наследования не требуется):
Цитата
// Dll.cpp

#include "Dll.h"

//////////////////////////////////////////////////////////////////////////


CSomeClass::CSomeClass()
{
   
value = 123;
}

CSomeClass::CSomeClass(int val)
{
   
value = val;
}

int CSomeClass::GetValue()
{
   
return value;
}


И, наконец, использовать этот класс в программе, подключающей длл. Для этого всего лишь потребуется подключить .h-файл (как и в Вашем примере) и библиотеку, создаваемую вместе с длл:
Цитата
// Program.cpp

#include "stdafx.h"
#include "stdio.h"


// подключение DLL

#include "..\\Dll\\Dll.h"
#ifdef _DEBUG
#pragma
comment(lib, "..\\Dll\\Debug\\Dll.lib")
#else
#pragma
comment(lib, "..\\Dll\\Release\\Dll.lib")
#endif


// использование класса, импортированного из DLL


int main(int argc, char* argv[])
{
   
CSomeClass a(1), b;

   
printf("a.value = %d; b.value = %d\n", a.GetValue(), b.GetValue());

   
return 0;
}


Вышеприведённый пример в виде проекта DLL+EXE можно скачать по ссылке (9 Кб):

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  TestClassExport.zip


--------------------
user posted image
PM MAIL WWW   Вверх
AndyY
Дата 9.7.2004, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



mr.DUDA
Да, есть такой вариант. Мне ближе мой по таким причинам:
1. мы полностью развязываем интерфейс и реализацию (и можно использовать пару LoadLibrary/GetProcAddress).
2. технологию хорошо применять для написания плагинов к прогам (интерфейс один, несколько реализаций в разных dll).

Но ваш безусловно тоже имеет право на жизнь, и, возможно, он действительно проще.


--------------------
PM MAIL WWW   Вверх
46&two
Дата 11.10.2004, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



mr.DUDA , ложка дегтя к вашему варианту: exclamation.gif
зачем огород городить, если в main файле все равно производится подключение #include "dll.h"?
Что если моя программа на момент компиляции не знает, какие библиотеки и в каком количестве ей предстоит использовать, а знает лишь, какую директорию сканировать в поисках dll и динамически пытаться подключить их?
Как вам такой вариант? sample.gif
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0899 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.