Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Можно ли осуществлять инициализацию объектов бизнес логики через RAII, т.е. тупо объявляя статические объекты в cpp-файлах в dll-ке, которая линкуется динамически к программе? Допустим есть программа, в .h-файле которой определена глобальная переменная. И эта программа во время исполнения динамически линкует к себе dll-ку. В этой dll-ке инициализация происходит в конструкторе глобального статического объекта, который обращается к глобальному объекту в самой программе (объект глобально объявлен в .h-файле, который используется и в программе и в dll-ке). Насколько такая схема логична и переносима в общем случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 17:41 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Про плагины слышал? Вот это оно! В главной программе делаешь: - ищем в каком-то каталоге dll - подгружаем все найденые dll по очереди - для каждой dll пытаемся запустить функцию init(something) - если такой функции нет или она отработала не верно - забываешь про dll А в самих dll'ях делаешь эту функцию init(something) которая будет дергать функции главной программы и регестрировать себя в каком-либо списке принадлежащем главной программе. Dll будет представляться, и объявлять себя обработчиком какого-то элемента бизнес логики. Ну а главная программа будет смотреть на этот список и решать на каком этапе бизнеса она сейчас находится и какие модули надо сейчас запустить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 19:52 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
White OwlПро плагины слышал? Вот это оно! В главной программе делаешь: - ищем в каком-то каталоге dll - подгружаем все найденые dll по очереди - для каждой dll пытаемся запустить функцию init(something) - если такой функции нет или она отработала не верно - забываешь про dll А в самих dll'ях делаешь эту функцию init(something) которая будет дергать функции главной программы и регестрировать себя в каком-либо списке принадлежащем главной программе. Dll будет представляться, и объявлять себя обработчиком какого-то элемента бизнес логики. Ну а главная программа будет смотреть на этот список и решать на каком этапе бизнеса она сейчас находится и какие модули надо сейчас запустить. Да, как раз про это. А можно вместо "- для каждой dll пытаемся запустить функцию init(something)", просто в DLL глобально объявить объект следующего вида?: Код: plaintext 1. 2. 3. 4. И в случае ошибки инициализации плагин просто не зарегистрируется в программе. А плюс здесь в том, что не нужно лишний раз вызывать init(something), которую можно забыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 20:02 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
... просто в DLL глобально объявить объект следующего вида и создать его: P1Init p1; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 20:03 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLLв случае ошибки инициализации плагин просто не зарегистрируется в программе. А как он будет "регистрироваться в программе"? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 20:04 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovRAII для инициализации в DLLв случае ошибки инициализации плагин просто не зарегистрируется в программе. А как он будет "регистрироваться в программе"? White Owl , предлагает из программы дергать функцию init в DLL, которая зарегестрирует. Я предлагаю в самой DLL: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 20:22 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLLЯ предлагаю в самой DLL: Повторяю вопрос: как init() будет "регистрироваться в программе"? Напиши код. В варианте White Owl для этого используется something, а каким трюком это будешь делать ты? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 20:26 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovRAII для инициализации в DLLЯ предлагаю в самой DLL: Повторяю вопрос: как init() будет "регистрироваться в программе"? Напиши код. В варианте White Owl для этого используется something, а каким трюком это будешь делать ты? Имеешь ввиду что something, который он передает в функцию - это ссылка/указатель на объект/функтор/коллбэк в программе используя который и будет происходить регистрация? Я предлагаю не передавать параметром этот объект в функцию init, а просто в самой init обращаться к нему, как к глобальному объекту, объявленному в программе. Т.е. предлагаю использовать Код: plaintext 1. где init - функция в DLL вызываемая в конструкторе глобального объекта в DLL obj - глобальный объект в программе, объявленный в хедере .h-файле, который используется и в программе и в DLL P1 - регистрируемый объект плагина, реализованный в DLL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 21:05 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLLв самой init обращаться к нему, как к глобальному объекту, объявленному в программе. Непонимание работы DLL detected. В морг. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 21:17 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovRAII для инициализации в DLLв самой init обращаться к нему, как к глобальному объекту, объявленному в программе. Непонимание работы DLL detected. В морг. В этом и вопрос, можно ли из DLL обращаться к глобальному объекту в программе не получая указатель на неё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 21:19 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
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 импортировать, это возможно, но скорее всего ты этого не делаешь (иначе не задавал бы такие вопросы). Как ты это всё делаешь -- надо вообще-то код смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 21:24 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLLИмеешь ввиду что something, который он передает в функцию - это ссылка/указатель на объект/функтор/коллбэк в программе используя который и будет происходить регистрация?Да, обычно это просто ссылка на реальную функцию регистрации. Но я встречал решения где в init() передавался указать на список модулей и dll просто добавляла себя к этому списку. RAII для инициализации в DLLЯ предлагаю не передавать параметром этот объект в функцию init, а просто в самой init обращаться к нему, как к глобальному объекту, объявленному в программе.Это тоже возможно, но для этого надо чтобы главная программа регестрировалась в OS каким-то образом. Тогда модуль сможет "искать прогамму" к которой ему надо подключаться. Вараинты: сделать именованый pipe, сервис, или даже открыть TCP сокет. Этот подход удобен когда модуль надо подгружать не на этапе инициализации программы а во время работы. Но это потребует большего думания на этапе дизайна - потребуется создать протокол регистрации, и скорее всего общение между модулем и главной программой надо будет организовывать по принципам клиент-сервера а не простыми колбэками. RAII для инициализации в DLLobj - глобальный объект в программе, объявленный в хедере .h-файле, который используется и в программе и в DLLВ .h ты можешь только объявить тип своего obj и перечислить методы/функции которыми с этим obj можно работать. Но реальный адрес объекта в памяти во время работы программы ты не будешь знать до запуска программы и создания этого объекта. Поэтому тебе в любом случае нужен некий механизм по передаче этого адреса между модулями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 21:29 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
White OwlRAII для инициализации в DLLobj - глобальный объект в программе, объявленный в хедере .h-файле, который используется и в программе и в DLLВ .h ты можешь только объявить тип своего obj и перечислить методы/функции которыми с этим obj можно работать. Но реальный адрес объекта в памяти во время работы программы ты не будешь знать до запуска программы и создания этого объекта. Поэтому тебе в любом случае нужен некий механизм по передаче этого адреса между модулями. Т.е. этот объект либо передавать параметром в функцию инициализации, либо через "именованый pipe, сервис, или даже открыть TCP сокет." или экспортировать из .exe определенный в .cpp программы и объявленный в общем .h-файле? MasterZivА чтобы тебе обращаться из .dll к переменной, определённой в .exe, из .exe нужно эту переменную экспортировать , а в .dll импортировать, это возможно, но скорее всего ты этого не делаешь (иначе не задавал бы такие вопросы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 21:50 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
White OwlRAII для инициализации в DLLЯ предлагаю не передавать параметром этот объект в функцию init, а просто в самой init обращаться к нему, как к глобальному объекту, объявленному в программе. Это тоже возможно, но для этого надо чтобы главная программа регестрировалась в OS каким-то образом. Тогда модуль сможет "искать прогамму" к которой ему надо подключаться. Вараинты: сделать именованый pipe, сервис, или даже открыть TCP сокет. Что-то ты, Большой Мудрый Белый Сов заработался. Или наоборот, заотдыхался. Это один процесс, у них одна память, зачем им средства межпроцессного взаимодействия использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 21:59 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLLТ.е. этот объект либо передавать параметром в функцию инициализации, либо через "именованый pipe, сервис, или даже открыть TCP сокет." или экспортировать из .exe определенный в .cpp программы и объявленный в общем .h-файле? Можно ещё на диск записать, зазиповать, потом в модуле (.dll) раззиповать, десериализовать в память, сделать с ним всё, что надо, потом опять записать на диск, зазиповать, и потом главная программа опять этот объект раскрутит в обратном порядке. Только нахрена, если этот объект лежит в памяти, общей для библиотеки и программы ? Хотя просто передавая указатель на этот объект в функции инициализации плагина, ты сможешь избежать изрядной доли гемора на свою задницу. А вот если фунции такой не планируется, и/или хочется инициализировать плагины автоматом, то -- да, надо морочиться с export/import. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 22:04 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLLТ.е. этот объект либо передавать параметром в функцию инициализации, либо через "именованый pipe, сервис, или даже открыть TCP сокет."Да RAII для инициализации в DLLили экспортировать из .exe определенный в .cpp программы и объявленный в общем .h-файле?Нет. Экспорт имеет смысл либо на этапе компиляции (для статического связывания), либо на этапе загрузки библиотеки в память. У уже работающей программы "экспортированные" функции и переменные превращаются в адреса в памяти и как "точки экспорта" более не доступны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 23:02 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
MasterZivЧто-то ты, Большой Мудрый Белый Сов заработался. Или наоборот, заотдыхался. Это один процесс, у них одна память, зачем им средства межпроцессного взаимодействия использовать?Для унификации. Если ты уже сделал процедуру регсистрации модуля через пайп, то почему-бы и дальше не работать через тот-же самый пайп? Проще жить. Но чаще всего подобное делается только в том случае если модуль должен быть загружен/выгружен независимо от хоста. Тогда эти модули получаются в адресном пространстве не хоста, а внешнего загрузчика, который обычно влинкован в модуль, так что можно говорить об адресном простанстве модуля. И тогда от IPC никуда не деться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 23:13 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
White OwlУ уже работающей программы "экспортированные" функции и переменные превращаются в адреса в памяти и как "точки экспорта" более не доступны. Однако GetProcAddress() вроде бы как работает... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2012, 23:19 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Какие еще пайпы? В отдельной DLL определяется и экспортируется глобальный объект через который плагины регистрируются в приложении. Там же в DLL могут быть размещены общие для плагинов функции. Программа при старте инициализирует импортированный глобальный объект, и потом для каждого плагина делает LoadLibrary. А DLL плагина тоже импортирует глобальный объект и регистрируется через него из конструкторов. Эта схема вполне рабочая кроме следующего момента. При инициализации DLL во время которой будут вызваны конструкторы объектов DLL, есть ограничения на создания потоков и процессов и связанных с ними примитивов (например нельзя вызывать LoadLibrary). Поэтому более правильно будет таки сделать функцию init() в каждом плагине, которую программа будет вызывать уже после загрузки DLL. Ну и в этом случае естественно удобнее передавать состояние программы не в глобальной переменной, а в аргументе init() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2012, 00:33 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyКакие еще пайпы? В отдельной DLL определяется и экспортируется глобальный объект через который плагины регистрируются в приложении. Там же в DLL могут быть размещены общие для плагинов функции. Программа при старте инициализирует импортированный глобальный объект, и потом для каждого плагина делает LoadLibrary. А DLL плагина тоже импортирует глобальный объект и регистрируется через него из конструкторов. Эта схема вполне рабочая кроме следующего момента. При инициализации DLL во время которой будут вызваны конструкторы объектов DLL, есть ограничения на создания потоков и процессов и связанных с ними примитивов (например нельзя вызывать LoadLibrary). А так когда-нибудь делали или видели проекты с подобным решением? Ну по сути во время инициализации обычно в конструктарах не нужны ни потоки/процессы, ни LoadLibrary. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2012, 00:39 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLLНу по сути во время инициализации обычно в конструктарах не нужны ни потоки/процессы, ни LoadLibrary. Счас не нужны, а потом в один прекрасный момент окажется что одна из функций неявно вызывает запрещенные АПИ и иногда возникает дедлок, и потом ловить его - одно удовольствие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2012, 01:18 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
> В этой dll-ке инициализация происходит в конструкторе глобального статического объекта, который обращается к глобальному объекту в самой программе (объект глобально объявлен в .h-файле, который используется и в программе и в dll-ке). Вы бы попробовали сначала это просто закодить, прежде чем на форумах спрашивать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2012, 11:53 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovWhite OwlУ уже работающей программы "экспортированные" функции и переменные превращаются в адреса в памяти и как "точки экспорта" более не доступны. Однако GetProcAddress() вроде бы как работает... Я тоже как-то не сталкивался с этим. Из .exe мы линковали данные в загружаемые динамически .dll. Хотя возможно я забыл, и это были не данные, а функции. Но вообще странно, GetProcAddress()-у то по барабану, адрес -- и адрес, а функция это или переменная -- дело программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2012, 12:37 |
|
||
|
Использовать RAII для инициализации объектов бизнес логики в DLL.
|
|||
|---|---|---|---|
|
#18+
RAII для инициализации в DLL, Разделяемая библиотека не обязaна инициализировать статические обьекты. Гораздо безопаснее инициализировать обьект при первом его запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2012, 22:42 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38035393&tid=2020675]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 282ms |

| 0 / 0 |
