powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использовать RAII для инициализации объектов бизнес логики в DLL.
29 сообщений из 29, показаны все 2 страниц
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035089
Можно ли осуществлять инициализацию объектов бизнес логики через RAII, т.е. тупо объявляя статические объекты в cpp-файлах в dll-ке, которая линкуется динамически к программе?

Допустим есть программа, в .h-файле которой определена глобальная переменная. И эта программа во время исполнения динамически линкует к себе dll-ку. В этой dll-ке инициализация происходит в конструкторе глобального статического объекта, который обращается к глобальному объекту в самой программе (объект глобально объявлен в .h-файле, который используется и в программе и в dll-ке).
Насколько такая схема логична и переносима в общем случае?
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035273
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про плагины слышал? Вот это оно!

В главной программе делаешь:
- ищем в каком-то каталоге dll
- подгружаем все найденые dll по очереди
- для каждой dll пытаемся запустить функцию init(something)
- если такой функции нет или она отработала не верно - забываешь про dll

А в самих dll'ях делаешь эту функцию init(something) которая будет дергать функции главной программы и регестрировать себя в каком-либо списке принадлежащем главной программе. Dll будет представляться, и объявлять себя обработчиком какого-то элемента бизнес логики.
Ну а главная программа будет смотреть на этот список и решать на каком этапе бизнеса она сейчас находится и какие модули надо сейчас запустить.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035284
White OwlПро плагины слышал? Вот это оно!

В главной программе делаешь:
- ищем в каком-то каталоге dll
- подгружаем все найденые dll по очереди
- для каждой dll пытаемся запустить функцию init(something)
- если такой функции нет или она отработала не верно - забываешь про dll

А в самих dll'ях делаешь эту функцию init(something) которая будет дергать функции главной программы и регестрировать себя в каком-либо списке принадлежащем главной программе. Dll будет представляться, и объявлять себя обработчиком какого-то элемента бизнес логики.
Ну а главная программа будет смотреть на этот список и решать на каком этапе бизнеса она сейчас находится и какие модули надо сейчас запустить.
Да, как раз про это.
А можно вместо "- для каждой dll пытаемся запустить функцию init(something)", просто в DLL глобально объявить объект следующего вида?:
Код: plaintext
1.
2.
3.
4.
class P1Init {
    public:
    P1Init() { init(something); }
};



И в случае ошибки инициализации плагин просто не зарегистрируется в программе.
А плюс здесь в том, что не нужно лишний раз вызывать init(something), которую можно забыть.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035287
... просто в DLL глобально объявить объект следующего вида и создать его:
P1Init p1;
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035289
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLв случае ошибки инициализации плагин просто не
зарегистрируется в программе.
А как он будет "регистрироваться в программе"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035306
Dimitry SibiryakovRAII для инициализации в DLLв случае ошибки инициализации плагин просто не
зарегистрируется в программе.
А как он будет "регистрироваться в программе"?

White Owl , предлагает из программы дергать функцию init в DLL, которая зарегестрирует.

Я предлагаю в самой DLL:
Код: plaintext
1.
2.
3.
4.
5.
class P1Init {
    public:
    P1Init() { init(something); }
};
P1Init p1;
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035314
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLЯ предлагаю в самой DLL:
Повторяю вопрос: как init() будет "регистрироваться в программе"? Напиши код.

В варианте White Owl для этого используется something, а каким трюком это будешь делать ты?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035356
Dimitry SibiryakovRAII для инициализации в DLLЯ предлагаю в самой DLL:
Повторяю вопрос: как init() будет "регистрироваться в программе"? Напиши код.

В варианте White Owl для этого используется something, а каким трюком это будешь делать ты?

Имеешь ввиду что something, который он передает в функцию - это ссылка/указатель на объект/функтор/коллбэк в программе используя который и будет происходить регистрация?

Я предлагаю не передавать параметром этот объект в функцию init, а просто в самой init обращаться к нему, как к глобальному объекту, объявленному в программе.

Т.е. предлагаю использовать
Код: plaintext
1.
init(void) { ojb->reg<P1>(P1->name); }


где init - функция в DLL вызываемая в конструкторе глобального объекта в DLL
obj - глобальный объект в программе, объявленный в хедере .h-файле, который используется и в программе и в DLL
P1 - регистрируемый объект плагина, реализованный в DLL
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLв самой init обращаться к нему, как к глобальному
объекту, объявленному в программе.
Непонимание работы DLL detected. В морг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035375
Dimitry SibiryakovRAII для инициализации в DLLв самой init обращаться к нему, как к глобальному
объекту, объявленному в программе.
Непонимание работы DLL detected. В морг.

В этом и вопрос, можно ли из DLL обращаться к глобальному объекту в программе не получая указатель на неё?
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035379
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLМожно ли осуществлять инициализацию объектов бизнес логики через RAII, т.е. тупо объявляя статические объекты в cpp-файлах в dll-ке, которая линкуется динамически к программе?


Да.

RAII для инициализации в DLLДопустим есть программа, в .h-файле которой определена глобальная переменная.

в .h-файле не может быть определена глобальная переменная.
Она там может быть объявлена.
Если она там определена, это -- ошибка. Это -- один шаг до нарушения ODR.
Такое может работать только если этот заголовок включается не более чем в один исходный модуль.

RAII для инициализации в DLL И эта программа во время исполнения динамически линкует к себе dll-ку. В этой dll-ке инициализация происходит в конструкторе глобального статического объекта, который обращается к глобальному объекту в самой программе (объект глобально объявлен в .h-файле, который используется и в программе и в dll-ке).
Насколько такая схема логична и переносима в общем случае?

Если ты собираеш с этим заголовком и .exe, и .dll, то твоя переменная (скорее всего) просто тупо будет объявлена и определена 2 раза, один раз -- в .exe, второй - в .dll. и .dll будет использовать свою переменную. Т.е. это будут две разные голобальные переменные, называемые одинаково на уровне исходного кода, но имеющие разные адреса на уровне машинного.

А чтобы тебе обращаться из .dll к переменной, определённой в .exe, из .exe нужно эту переменную экспортировать, а в .dll импортировать, это возможно, но скорее всего ты этого не делаешь (иначе не задавал бы такие вопросы).

Как ты это всё делаешь -- надо вообще-то код смотреть.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035380
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLИмеешь ввиду что something, который он передает в функцию - это ссылка/указатель на объект/функтор/коллбэк в программе используя который и будет происходить регистрация?Да, обычно это просто ссылка на реальную функцию регистрации.
Но я встречал решения где в init() передавался указать на список модулей и dll просто добавляла себя к этому списку.

RAII для инициализации в DLLЯ предлагаю не передавать параметром этот объект в функцию init, а просто в самой init обращаться к нему, как к глобальному объекту, объявленному в программе.Это тоже возможно, но для этого надо чтобы главная программа регестрировалась в OS каким-то образом. Тогда модуль сможет "искать прогамму" к которой ему надо подключаться. Вараинты: сделать именованый pipe, сервис, или даже открыть TCP сокет.
Этот подход удобен когда модуль надо подгружать не на этапе инициализации программы а во время работы. Но это потребует большего думания на этапе дизайна - потребуется создать протокол регистрации, и скорее всего общение между модулем и главной программой надо будет организовывать по принципам клиент-сервера а не простыми колбэками.

RAII для инициализации в DLLobj - глобальный объект в программе, объявленный в хедере .h-файле, который используется и в программе и в DLLВ .h ты можешь только объявить тип своего obj и перечислить методы/функции которыми с этим obj можно работать. Но реальный адрес объекта в памяти во время работы программы ты не будешь знать до запуска программы и создания этого объекта. Поэтому тебе в любом случае нужен некий механизм по передаче этого адреса между модулями.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035393
White OwlRAII для инициализации в DLLobj - глобальный объект в программе, объявленный в хедере .h-файле, который используется и в программе и в DLLВ .h ты можешь только объявить тип своего obj и перечислить методы/функции которыми с этим obj можно работать. Но реальный адрес объекта в памяти во время работы программы ты не будешь знать до запуска программы и создания этого объекта. Поэтому тебе в любом случае нужен некий механизм по передаче этого адреса между модулями.
Т.е. этот объект либо передавать параметром в функцию инициализации, либо через "именованый pipe, сервис, или даже открыть TCP сокет." или экспортировать из .exe определенный в .cpp программы и объявленный в общем .h-файле?

MasterZivА чтобы тебе обращаться из .dll к переменной, определённой в .exe, из .exe нужно эту переменную экспортировать , а в .dll импортировать, это возможно, но скорее всего ты этого не делаешь (иначе не задавал бы такие вопросы).
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035399
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlRAII для инициализации в DLLЯ предлагаю не передавать параметром этот объект в функцию init, а просто в самой init обращаться к нему, как к глобальному объекту, объявленному в программе.

Это тоже возможно, но для этого надо чтобы главная программа регестрировалась в OS каким-то образом. Тогда модуль сможет "искать прогамму" к которой ему надо подключаться. Вараинты: сделать именованый pipe, сервис, или даже открыть TCP сокет.


Что-то ты, Большой Мудрый Белый Сов заработался. Или наоборот, заотдыхался.
Это один процесс, у них одна память, зачем им средства межпроцессного взаимодействия использовать?
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035404
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLТ.е. этот объект либо передавать параметром в функцию инициализации, либо через "именованый pipe, сервис, или даже открыть TCP сокет." или экспортировать из .exe определенный в .cpp программы и объявленный в общем .h-файле?


Можно ещё на диск записать, зазиповать, потом в модуле (.dll) раззиповать, десериализовать в память, сделать с ним всё, что надо,
потом опять записать на диск, зазиповать, и потом главная программа опять этот объект раскрутит в обратном порядке.

Только нахрена, если этот объект лежит в памяти, общей для библиотеки и программы ?

Хотя просто передавая указатель на этот объект в функции инициализации плагина, ты сможешь избежать изрядной доли гемора на свою задницу.

А вот если фунции такой не планируется, и/или хочется инициализировать плагины автоматом, то -- да, надо морочиться с export/import.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035441
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLТ.е. этот объект либо передавать параметром в функцию инициализации, либо через "именованый pipe, сервис, или даже открыть TCP сокет."Да

RAII для инициализации в DLLили экспортировать из .exe определенный в .cpp программы и объявленный в общем .h-файле?Нет. Экспорт имеет смысл либо на этапе компиляции (для статического связывания), либо на этапе загрузки библиотеки в память. У уже работающей программы "экспортированные" функции и переменные превращаются в адреса в памяти и как "точки экспорта" более не доступны.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035448
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧто-то ты, Большой Мудрый Белый Сов заработался. Или наоборот, заотдыхался.
Это один процесс, у них одна память, зачем им средства межпроцессного взаимодействия использовать?Для унификации. Если ты уже сделал процедуру регсистрации модуля через пайп, то почему-бы и дальше не работать через тот-же самый пайп? Проще жить.
Но чаще всего подобное делается только в том случае если модуль должен быть загружен/выгружен независимо от хоста. Тогда эти модули получаются в адресном пространстве не хоста, а внешнего загрузчика, который обычно влинкован в модуль, так что можно говорить об адресном простанстве модуля. И тогда от IPC никуда не деться...
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035453
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlУ уже работающей программы "экспортированные" функции и переменные
превращаются в адреса в памяти и как "точки экспорта" более не доступны.

Однако GetProcAddress() вроде бы как работает...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035515
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие еще пайпы?

В отдельной DLL определяется и экспортируется глобальный объект через который плагины регистрируются в приложении. Там же в DLL могут быть размещены общие для плагинов функции.

Программа при старте инициализирует импортированный глобальный объект, и потом для каждого плагина делает LoadLibrary.
А DLL плагина тоже импортирует глобальный объект и регистрируется через него из конструкторов.

Эта схема вполне рабочая кроме следующего момента.
При инициализации DLL во время которой будут вызваны конструкторы объектов DLL, есть ограничения на создания потоков и процессов и связанных с ними примитивов (например нельзя вызывать LoadLibrary).

Поэтому более правильно будет таки сделать функцию init() в каждом плагине, которую программа будет вызывать уже после загрузки DLL. Ну и в этом случае естественно удобнее передавать состояние программы не в глобальной переменной, а в аргументе init()
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035520
Anatoly MoskovskyКакие еще пайпы?

В отдельной DLL определяется и экспортируется глобальный объект через который плагины регистрируются в приложении. Там же в DLL могут быть размещены общие для плагинов функции.

Программа при старте инициализирует импортированный глобальный объект, и потом для каждого плагина делает LoadLibrary.
А DLL плагина тоже импортирует глобальный объект и регистрируется через него из конструкторов.

Эта схема вполне рабочая кроме следующего момента.
При инициализации DLL во время которой будут вызваны конструкторы объектов DLL, есть ограничения на создания потоков и процессов и связанных с ними примитивов (например нельзя вызывать LoadLibrary).

А так когда-нибудь делали или видели проекты с подобным решением?

Ну по сути во время инициализации обычно в конструктарах не нужны ни потоки/процессы, ни LoadLibrary.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035538
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLLНу по сути во время инициализации обычно в конструктарах не нужны ни потоки/процессы, ни LoadLibrary.
Счас не нужны, а потом в один прекрасный момент окажется что одна из функций неявно вызывает запрещенные АПИ и иногда возникает дедлок, и потом ловить его - одно удовольствие.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38035955
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> В этой dll-ке инициализация происходит в конструкторе глобального статического объекта, который обращается к глобальному объекту в самой программе (объект глобально объявлен в .h-файле, который используется и в программе и в dll-ке).

Вы бы попробовали сначала это просто закодить, прежде чем на форумах спрашивать..
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38036082
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovWhite OwlУ уже работающей программы "экспортированные" функции и переменные
превращаются в адреса в памяти и как "точки экспорта" более не доступны.

Однако GetProcAddress() вроде бы как работает...


Я тоже как-то не сталкивался с этим. Из .exe мы линковали данные в загружаемые динамически .dll.
Хотя возможно я забыл, и это были не данные, а функции. Но вообще странно, GetProcAddress()-у то
по барабану, адрес -- и адрес, а функция это или переменная -- дело программы.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38037127
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAII для инициализации в DLL,

Разделяемая библиотека не обязaна инициализировать статические обьекты. Гораздо безопаснее инициализировать обьект при первом его запросе.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38037566
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Разделяемая библиотека не обязaна инициализировать статические обьекты.
???
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38038165
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kosh the best> Разделяемая библиотека не обязaна инициализировать статические обьекты.
???
Исполнение стартовой функции при загрузке разделяемой библиотеки - это исключительно для вызова С++ конструкторов. С другой стороны это за пределами С++ стандарта. Да PE и ELF форматы это делают. Но одно дело "делать" и совсем другое "обязан сделать".
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38038416
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Исполнение стартовой функции при загрузке разделяемой библиотеки - это исключительно для вызова С++ конструкторов. С другой стороны это за пределами С++ стандарта. Да PE и ELF форматы это делают. Но одно дело "делать" и совсем другое "обязан сделать".
вы не правы
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38038812
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCckosh the best> Разделяемая библиотека не обязaна инициализировать статические обьекты.
???
Исполнение стартовой функции при загрузке разделяемой библиотеки - это исключительно для вызова С++ конструкторов. С другой стороны это за пределами С++ стандарта. Да PE и ELF форматы это делают. Но одно дело "делать" и совсем другое "обязан сделать".

Что за пределами стандарта, вызов конструкторов статических объектов ?
:-)

Вот создателям библиотек и приходится реализовывать эти требования стандарта.
Разделяемые библиотеки -- за пределами стандарта, но если они хотят содержать код на С++, то им
приходится поддерживать требования этого языка.
...
Рейтинг: 0 / 0
Использовать RAII для инициализации объектов бизнес логики в DLL.
    #38038978
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле стандарт даже помогает реализовывать динамические библиотеки.
Там есть пункт, который разрешает вызывать конструкторы нелокальных объектов не перед main, а перед первым вызовом функций которые их используют.
Т.е. почти открытым текстом поддерживается отложенная (по первому обращению) загрузка дин.библиотек.
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использовать RAII для инициализации объектов бизнес логики в DLL.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]