Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll-явное связывание + классы 
:(
    Опции темы
Fire-Plug
Дата 14.4.2005, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Fantasist @ 13.4.2005, 23:09)
Кажется вполне возможным написать обертку, которая будет грузить библиотеку с помощью LoadLibrary и вызывать методы через GetProcAddress (включая конструкторы и деструкторы).

В статье по вышеуказ. ссылке http://rsdn.ru/article/baseserv/dlluse.xml как раз и рассматривается конкрентная техника как это сделать. Хотя надо сразу сказать, что это достаточно неудобно.
Потому и шла речь о том, чтобы в DLL реализовать класс(ы) и способ его создания (фабрику объектов или что угодно) и по запросу только получать указатель на объект нужного типа. В DLL также нужно реализовать мехнизм удаления объекта по запросу или просто при ее выгрузке.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
chipset
Дата 15.4.2005, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Fantasist @ 13.4.2005, 13:09)
Кажется вполне возможным написать обертку, которая будет грузить библиотеку с помощью LoadLibrary и вызывать методы через GetProcAddress (включая конструкторы и деструкторы).

А в чём преимущество такого подхода? Почему бы просто не получать указатель на фабрику классов?

Кстати, имхо, лучшим вариантом было бы:
Цитата(Fire @ 11.4.2005, 22:00)
3) Можно 2) реализовать путем заимствования идеи COM в плане подсчета ссылок. Тогда лучше возвращать указатель не на сам объект, а объект типа COM-указателя для целевого класса, для к-рого нужно будет добавить методы аналогичные AddREf() и Release(). А в DLL реализовать механизм для хранения и удаления объекта, если к-во его ссылок = 0.


Цитата(Guest @ 12.4.2005, 13:11)
Ничем не хуже, чем delete myObj.

А если обьектом пользуются сразу два процесса?
Добавлено @ 22:21
Цитата(Fire @ 13.4.2005, 18:43)
В DLL также нужно реализовать мехнизм удаления объекта по запросу

А если два процесса на один обьект?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fantasist
Дата 15.4.2005, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата(Guest @ 12.4.2005, 20:11)
Конечно можно, если охота для частной задачи писать реализацию обязательной части интерфейса и возиться с его регистрацией.


Из обязательной части там только IUnknown реализовать нужно, да и его реализацию можно сделать ATL'ем. Регестрировать тоже не обязательно, можно создавать объект напрямую вызывая DllGetClassObject.


Хотя я бы возвращал указатель на экземляр из dll. А в самом классе создал бы метод Destroy, который бы удалял сам себя, и перегрузил бы delete для него, чтобы он происходил через вызов Destroy(). В этом случае даже если delete будет вызван в основном модуле для указателя полученного из dll, объект удалится в dll.


Добавлено @ 22:29
Цитата(chipset @ 15.4.2005, 19:20)
А если обьектом пользуются сразу два процесса?
Добавлено @ 19:21
Цитата (Fire-Plug @ 13.4.2005, 18:43)
В DLL также нужно реализовать мехнизм удаления объекта по запросу

А если два процесса на один обьект?


Вопросы синхронизации к данной теме не относятся. К тому же, один объект не может быть использован в разных процессах ибо у них разное адресное пространство (ну, конечно, это возможно, но только после дополнительных телодвижений).
Добавлено @ 22:31
Цитата(chipset @ 15.4.2005, 19:20)
А в чём преимущество такого подхода? Почему бы просто не получать указатель на фабрику классов?


Преимущество в том, что не надо думать, как правильно создать и удалить объект.

Это сообщение отредактировал(а) Fantasist - 15.4.2005, 22:31


--------------------
Волны гасят ветер...
PM MAIL   Вверх
chipset
Дата 15.4.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Fantasist @ 15.4.2005, 12:26)
Из обязательной части там только IUnknown реализовать нужно, да и его реализацию можно сделать ATL'ем.

Ещё ATL прикручивать... smile

Цитата(Fantasist @ 15.4.2005, 12:26)
Хотя я бы возвращал указатель на экземляр из dll.

Тогда это и есть мини-фабрика обьектов, как я её понимаю.. smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fire-Plug
Дата 18.4.2005, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(chipset @ 15.4.2005, 22:20)
А если обьектом пользуются сразу два процесса?

У каждого процесса - своя память, в т.ч. динамическая. Ф-цию DLL может вызывать фуева хуча процесссов.
Цитата(chipset @ 15.4.2005, 22:20)
А если два процесса на один обьект?

Сейчас поищу ссылку на статейку, к-рая рассказывает, как память DLL отображается на адресное пространство процесса. Все переменные, что экспортируются из/создаются кодом DLL - уникальны в адресном пространстве данного процесса и процесами не разделяются (not shared).
Иначе, спрашивается, нахрена нужна была бы куча механизмов IPC(Inter-Process Communication), ежели бы переменные из разных процессов так запросто можно было бы share-ть. А вот исполняемый код - разделяется всеми процессами, к-рые юзают данную DLL.
Ну, че искать статейку? Ваще ее в MSDN можно было года 3-4 назад легко найти. Только вот назывется больно обидно "DLL for beginners".

--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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