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

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

Войти
Регистрация
Восстановить пароль
 
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
#1

Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? - C++

06.05.2014, 12:41. Просмотров 339. Ответов 11
Метки нет (Все метки)

Всем привет!

Хотелось бы узнать, возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы?

Допустим есть класс A, который собирается в основной программе.
Основная программа подгружает динамическую библиотеку, создаёт объект класса A, и передаёт в метод который объявлен в библиотеке указатель на данный объект.

Библиотека же не сможет вызывать методы данного объекта, если они небыли объявлены как виртуальные. Возможно ли сделать так, чтоб это стало возможным?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 12:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы? (C++):

Возможно ли переделать код этой программы так, чтобы обойтись без функции? - Turbo Pascal
Здравствуйте Возможно ли переделать код этой программы так, чтобы обойтись без функции? uses Crt; var x: real; function...

Возможно ли сделать из программы библиотеку dll? - C++ WinAPI
Собственно, возможно ли какими-то способами сделать уже из готового приложения библиотеку dll?

Вызов подпрограммы из основной программы, с сохранением работоспособности основной программы?(подробно внутри) - C++ Builder
Добрый день. Буду благодарен, если кто-нибудь подскажет как такое реализовать. Суть вопроса: В основном консольном приложении...

Как подгрузить библиотеку? - Delphi
Не могу понять как тут её подгрузить: library HOOK; uses Windows, SysUtils, TLhelp32; type NTStatus = cardinal;

Как полностью удалять программы на wine, так чтоб не осталось и следов? - Ubuntu Linux
Установил программу на wine, но пришлось ее потом удалить без следно для повторной устновки. После удаления еще осталось куча файлов и...

Нужно сделать так чтоб с одной программы работать одновременно с двух компьютеров - 1С
всем привет помогите! мне нужно сделать так чтоб с одной программы работать одновременно с двух компьютеров

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
06.05.2014, 12:47 #2
Для того, чтобы обратиться к атрибутам сущности в сборке (пусть, к методам класса в библиотеке), нужно, чтобы в этой сборке был как минимум доступен интерфейс класса. Ну это капитанство.

Ближе к теме: зависимость библиотеки от программы - нелогичное решение. Не надо так.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 12:58  [ТС] #3
Ближе к теме: зависимость библиотеки от программы - нелогичное решение. Не надо так.
А как тогда устроить систему плагинов? Допустим есть приложением, есть библиотека - модуль.
Приложение подгружает модули, передавая указатель на некий объект, который предоставляет контроль над приложением.

Допустим у нас есть интерфейс:
C++
1
2
3
4
class ILogger
{
    virtual void log( const char *msg );
};
Например у нас есть приложение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Logger : public ILogger
{
    void log( const char *msg ) override
    {
        std::cout << msg;
    }
};
 
int main()
{
    ILogger *logger = new Logger;
 
    dlopen( module );
    initModule  = dlsym( "initModule" );
    initModule( logger );
 
    return 0;
}
Модуль:

C++
1
2
3
4
5
6
bool initModule( ILogger *logger )
{
    logger->log( "hi" );
 
    return true;
}
Ну это отвечая на Ваш вопрос, а вообще просто интересно можно ли сделать так, чтоб компоновщик искал не только в самой библиотеке, а ссылался на основное приложение?
0
newbie666
Заблокирован
06.05.2014, 13:01 #4
Цитата Сообщение от kvadro Посмотреть сообщение
Библиотека же не сможет вызывать методы данного объекта, если они небыли объявлены как виртуальные
с чего это не сможет? Если ты передаёшь в библиотечную функцию экземпляр какого - то класса, то почему библиотеку не сможет с ним работать? Сможет конечно. Как ты класс в библиотеку передаешь?
0
Croessmah
Эксперт CЭксперт С++
13219 / 7491 / 844
Регистрация: 27.09.2012
Сообщений: 18,410
Записей в блоге: 3
Завершенные тесты: 1
06.05.2014, 13:02 #5
Цитата Сообщение от kvadro Посмотреть сообщение
А как тогда устроить систему плагинов
http://www.cyberforum.ru/cpp-experts/thread123914.html
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 13:07  [ТС] #6
с чего это не сможет? Если ты передаёшь в библиотечную функцию экземпляр какого - то класса, то почему библиотеку не сможет с ним работать? Сможет конечно. Как ты класс в библиотеку передаешь?
Ну со свойствами сможет, ибо у нас будет указатель на объект, но вот с методами нет, ибо методы должны быть описаны в самой библиотеке.

Добавлено через 1 минуту
По идеи даже не соберётся.
0
newbie666
Заблокирован
06.05.2014, 13:14 #7
Цитата Сообщение от kvadro Посмотреть сообщение
ибо методы должны быть описаны в самой библиотеке.
по этому я и спрашиваю, как ты в библиотечную функцию передаёшь экземпляр класса, если так:
void DLL_FUNC(MySuperClass *msc); - то значит, твоя dll-ка уже знает об этом классе (в dll-ке должен быть инклюдник с этим классом), а если так: void DLL_FUNC(void *HZ_CHTO_TAM) - тогда да, работать не сможешь
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 13:26  [ТС] #8
то значит, твоя dll-ка уже знает об этом классе
Она будет знать то, что ей покажут. А значит:

C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
   void hello()
   {
      // ...
   }
 
   void hello2();
 
   int a;
};

То работать она сможет только с методом hello() и со свойством a. Метод void hello2(); будет для неё как Undefined symbols
0
newbie666
Заблокирован
06.05.2014, 13:59 #9
Цитата Сообщение от kvadro Посмотреть сообщение
Метод void hello2(); будет для неё как Undefined symbols
ну с чего ты взял? Сделай инклюд хедера своего класса в DLL и будет она всё знать
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
06.05.2014, 14:12 #10
Взаимодействие через интерфейсы - нормальный вариант. И пример в третьем посте вполне работоспособный (после доведения до компилируемого состояния).
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
06.05.2014, 14:37  [ТС] #11
ну с чего ты взял? Сделай инклюд хедера своего класса в DLL и будет она всё знать
О чём знать? Он будет знать что в данном классе есть метод hello2, но это только прототип, откуда брать реализацию он не будет знать.

Взаимодействие через интерфейсы - нормальный вариант.
Он нормальный, но порождает множество интерфейсов. Из поста 3, наверняка, если бы мы разрабатывали модульную систему, то передавали бы не сам логгер, а некий API:

C++
1
2
3
4
5
6
7
class IApp
{
    virtual ILogger *logger();
    // ...
    // доступ к другим интерфейсам
    // ...
};
В итоге минусы:
- Множество интерфейсов
- Отсутствие возможности доступа к свойствам объекта.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
06.05.2014, 14:44 #12
В С++ статическая типизация и нет нормальной рефлексии, что тут добавить.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 14:44
Привет! Вот еще темы с ответами:

Как при переустановке сделать так чтоб все установленные программы не пришлось переустанавливать? - Windows XP
Подскажите как при переустановке виндовс xp сделать так чтоб все установленные программы не пришлось переустанавливать и лицензионный ключ...

как сделать так, чтоб если вводишь не цифры, а буквы он не выкидывал из программы, а выполнял команду - C++
Всем привет. Помогите. я начал программировать в С++ и спрогал калькулятор. вот код: #include &lt;iostream&gt; #include &lt;cmath&gt; using...

Создание файла .txt и как сделать так чтоб он не изменялся при каждом запуске программы? - Visual Basic
Private Sub Form_Load() Dim f As Integer f = FreeFile Open &quot;C:\tmp&quot; &amp; &quot;\amd.txt&quot; For Output As f Print #f, Date Print #f, Time ...

как сделать так, чтоб при работе программы можно было вводить в качестве данных русские слова? - C++
мммм?


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

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

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