Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как из динамически подгружаемой Dll вытащить класс

285
12 августа 2004 года
Romik
479 / / 24.11.2002
Как из динамически подгружаемой DLL вытащить класс, из статически подгружаемой библиотеки нет проблем (в книгах это подробно описано). В DEF файле методы моего классы выглядят как TMyClass::SayHello(void *), а в моём классе метод объявлян как void __fastcall SayHello(HWND h). Я так понимаю что нужно создать указатель на этот метод (и на все методы моего класса) так же как и на любую другую функцию в DLL. Но как правильно это сделать я не знаю. Пробывал так SayHello=((void)(__fastcall*)(void*)) Ясное дело - это не работает. Буду благодарен всем кто откликнется.

P.S.
Надеюсь с DLL у Вас больше опыта нежели с Indy.
310
12 августа 2004 года
fellow
853 / / 17.03.2003
Что значит "вытащить"?
1
13 августа 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Romik
Как из динамически подгружаемой DLL вытащить класс, из статически подгружаемой библиотеки нет проблем (в книгах это подробно описано). В DEF файле методы моего классы выглядят как TMyClass::SayHello(void *), а в моём классе метод объявлян как void __fastcall SayHello(HWND h). Я так понимаю что нужно создать указатель на этот метод (и на все методы моего класса) так же как и на любую другую функцию в DLL. Но как правильно это сделать я не знаю. Пробывал так SayHello=((void)(__fastcall*)(void*)) Ясное дело - это не работает. Буду благодарен всем кто откликнется.

P.S.
Надеюсь с DLL у Вас больше опыта нежели с Indy.


Помоему каждые полгода на форуме создается тема - как вытащить ... из длл. Может объединить их в одну?
Для того чтобы экспортировать класс из длл есть несколько способов. Первый - это создать базовый абстрактный класс и объявить нужные тебе функции как виртуальные - остальные классы наследовать от него. Фактически это вариант технологии COM.
Второй вариант - это объявление фукций класса, который экспортируется, виртуальными без базовых классов. И третий - самый громоздкий - использование списка экспортируемых функций.
Выглядит так:

Код:
typedef TdmDoc* (__import DocumentClass)(HWND CApp,char* server,char* user,char* pass,char* role);
...
DocumentClass *DocumentList; //
....
 HINSTANCE dllInstance =  LoadLibrary("dmregdoc.dll");
 DocumentList = (DocumentClass*)GetProcAddress(dllInstance,"_CreateDmModule");
...
 dmDoc = DocumentList(this,"server:base","USER","PASS","");
//Здесь вызывается функция создающая класс доступа к базе данных
  dmDoc->actConnect->Execute();
//Здесь функции класса.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог