Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ActiveX Dll, корневой объект, есть ли доступ внутри DLL / 12 сообщений из 12, страница 1 из 1
19.01.2005, 11:27:22
    #32871811
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
Есть Apartment threaded ActiveX Dll.
Instancing корневого объекта – GlobalMultiUse.
Такой объект создается автоматически при вызове клиентом его методов.
Есть ли разумная техника использования методов такого типа объекта в
частных (приватных) классах внутри DLL?
...
Рейтинг: 0 / 0
19.01.2005, 12:05:12
    #32871929
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
СдутыйШарикЕсть Apartment threaded ActiveX Dll.
Instancing корневого объекта – GlobalMultiUse.
Такой объект создается автоматически при вызове клиентом его методов.
Есть ли разумная техника использования методов такого типа объекта в
частных (приватных) классах внутри DLL? Как Global - нельзя. Но никто не мешает сделать экземпляр GlobalMultiUse класса "обычным" способом

Dim object as MyClass
Set object = new MyClass
object.MyMethod

На всякий случай напомню еще, что в библиотеке можно написать Sub Main в модуле и указать ее как Startup Object. А в Sub Main описать переменную типа вашего класса как Public.
Тогда она будет создана при обращении к библиотеке и может быть использована внутри нее.
Не так удобно, как Global, но все таки
...
Рейтинг: 0 / 0
19.01.2005, 12:56:38
    #32872175
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
За ответ спасибо.
Этот корень должен выступать в роли «фабрики классов».
Предполагается, что заявленные как PublicNotCreatable интерфейсы относительно стабильны. Хочется скрыть «стандартные» реализации, предоставив методы
«фабричных» конструкторов. GlobalMuliUse класс на стороне клиента хорошо
подходит для размещения таких методов.
Проблема в том, что реализации внутри себя содержат те же интерфейсные переменные в качестве делегатов или скрытых членов, инициализируемых в стандартном конструкторе приватных классов. Возможно, это не очень умное проектирование, но сейчас хочется построить «единый механизм» обращения к функциям-конструкторам (хотя бы на уровне имен) внутри DLL и вне ее. Пока просматривается «теневой» стандартный модуль, на одноименные функции которого будут полагаться «фабричные» методы GlobalMultiUse – класса.
Подумал, может кто что умнее присоветует…

Вопрос можно переформулировать так. Пусть я создам рекомендованную Main с экземпляром переменной моего глобал-класса, и объявлю Main как стартовый для DLL.
Вопрос – когда клиент обратиться к фабричному методу, определенному в глобал-классе – для него будет создан новый экземпляр, или система сообразит обратиться к закешированному в модуле, содержащем Main ?
...
Рейтинг: 0 / 0
19.01.2005, 13:25:30
    #32872260
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
СдутыйШарикВопрос – когда клиент обратиться к фабричному методу, определенному в глобал-классе – для него будет создан новый экземпляр, или система сообразит обратиться к закешированному в модуле, содержащем Main ? Будет создан новый :(

По поводу фабрики классов - хороший подход, нормальный. Для того, чтобы и внутри и вне библиотеки был единый (по крайней мере внешне) подход к работе с ф-кой классов могу предложить следующее (возможно это вариация на тему того, что вы обозначили как " «теневой» стандартный модуль, на одноименные функции которого будут полагаться «фабричные» методы GlobalMultiUse – класса.
"):
Пусть есть класс-фабрика классов ClassFactory. Instancing у нее (внимание!) PublicNotCreatable, т.е. ее нельзя создать извне библиотеки (и это хорошо)
В MainModule пишем
Код: plaintext
1.
2.
3.
4.
Public Factory As ClassFactory
Sub Main()
    Set Factory = New ClassFactory 'Теперь у нас есть экземпляр ф-ки классов, к которому можно обратится внутри библиотеки
End Sub
Создаем новый класс ClassFactorySupplier. Instancing - GlobalMultyUse. В нем пишем:
Код: plaintext
1.
2.
3.
4.
5.
6.
 
'Именно к этому свойству будет доступ извне библиотеки.
'Одновременно это решит проблему с одним экземпляром ClassFactory
Public Property Get Factory () As ClassFactory
    Set Factory  = MainModile.Factory 
End Property
Т.о. разработчики и внутри и вне библиотеки привыкнут писать для получения экземпляра какого-либо класса
Код: plaintext
1.
dim a as Sample
set a = Factory.GetInstanace
Только внутри библиотеки это будет доступ к Public переменной из MainModul-я
А вне библиотеки - к свойству GlobalMultyUse класса, хотя экземпляр ClassFactory будет одним и тем же
...
Рейтинг: 0 / 0
19.01.2005, 13:54:11
    #32872343
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
Я подразумевал чуть иначе - в стандартном модуле обычная функция
Function createMyClassObject() as IMyClass

В глобальном классе –
Function createMyClassObject() as IMyClass
Set createMyClassObject = MyModule.createMyClassObject
End Function

Поковыряю в носу на тему – не пойти ли Вашей дорогой.
Требует некоторого додумывания следующее – ClassFactory в этой ситуации должен быть публичным классом, скорее всего IClassFactory PublicNotCreatable.
Тогда Public Factory As ClassFactory должен реализовывать его интерфейс.
А глобальная функция будет такой

Public Property Get Factory () As IClassFactory
Set Factory = MainModile.Factory
End Property

То есть, если с разбегу, то, похоже, пришли откуда вернулись – для внутреннего пользования все равно понадобится аналогичная в MainModule.

Спасибо за ответы. Как будто картинка устоялась.
...
Рейтинг: 0 / 0
19.01.2005, 14:18:28
    #32872411
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
Вот еще подумал - Если DLL окажется Retained In Memory, то, наверно,
потребуется писать дополнительный публичный клинап-метод для кешированных в модулях ДЛЛ объектов?
...
Рейтинг: 0 / 0
19.01.2005, 14:23:56
    #32872420
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
СдутыйШарикВот еще подумал - Если DLL окажется Retained In Memory, то, наверно,
потребуется писать дополнительный публичный клинап-метод для кешированных в модулях ДЛЛ объектов? А зачем ? Объект освободится из памяти тогда, когда обнулится счетчик ссылок на него.
Просто аккуратно устанавливайте в Nothing все объекты, когда они вам больше не нужны. Как внутри библиотеки, так и вне.
...
Рейтинг: 0 / 0
19.01.2005, 14:48:45
    #32872487
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
авторА зачем ? Объект освободится из памяти тогда, когда обнулится счетчик ссылок на него

Для "нормального" Apartment Threaded DLL, как я понимаю,
кешированный в локальном модуле ДЛЛ объект освободится по завершении клиентского приложения, в момент выгрузки ДЛЛ.

Меняет ли это поведение флаг "Retained In Memory"?
...
Рейтинг: 0 / 0
19.01.2005, 15:16:03
    #32872602
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
СдутыйШарик авторА зачем ? Объект освободится из памяти тогда, когда обнулится счетчик ссылок на него

Для "нормального" Apartment Threaded DLL, как я понимаю,
кешированный в локальном модуле ДЛЛ объект освободится по завершении клиентского приложения, в момент выгрузки ДЛЛ.

Меняет ли это поведение флаг "Retained In Memory"? Нет Apartment Threaded тут не причем. Они (библиотеки в VB) собственно все Apartment Threaded, только при Single Threaded, это соответствовует одному Apartment :)

Retained In Memory - насколько я помню введен из-за особенностей проектирования компонент под IIS и MTS (?)
MSDNRetained in Memory — This option, available in the Project Properties dialog box for your IIS applications, allows the Visual Basic project to keep its run-time support state permanently loaded on the server's threads, allowing server programs that load Visual Basic projects to run significantly faster. Для *обычного* VB приложения влияния не оказывает, т.к. оно (приложение) не вызывает CoFreeUnusedlibraries

Т.о:
Объект (мы говорим об экземпляре класса) освободится из памяти тогда, когда счетчик ссылок на него станут равным 0. Это легко проверить по поведению Class_Terminate
Однако библиотека из памяти не выгрузится (в случае *обычного* VB приложения), даже если ни один ресурс из нее не используется. Это легко проверить по поведению Sub Main
...
Рейтинг: 0 / 0
19.01.2005, 15:37:11
    #32872682
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
до тестов мне прямо сейчас малость рановато.
Как бы это все на русский перевсти до опыта...

авторТ.о:
Объект (мы говорим об экземпляре класса) освободится из памяти тогда, когда счетчик ссылок на него станут равным 0. Это легко проверить по поведению Class_Terminate

то есть, если сделать так

авторВ MainModule пишем
Public Factory As ClassFactory
Sub Main()
Set Factory = New ClassFactory 'Теперь у нас есть экземпляр ф-ки классов, к которому можно обратится внутри библиотеки
End Sub

и не предусмотреть публичного клинап-метода, то


автор... библиотека из памяти не выгрузится (в случае *обычного* VB приложения), даже если ни один ресурс из нее не используется. Это легко проверить по поведению Sub Main

Я правильно Вас понял?
Если да, то как разумно воспользоваться советом

авторПросто аккуратно устанавливайте в Nothing все объекты, когда они вам больше не нужны

внутри библиотеки? Как сидя внутри нее понять, что

авторPublic Factory As ClassFactory

больше не нужны?

ЗЫ
Истина где-то рядом. Осталось научиться разпознавать изображения...
...
Рейтинг: 0 / 0
19.01.2005, 15:53:18
    #32872727
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
СдутыйШарик

внутри библиотеки? Как сидя внутри нее понять, что

авторPublic Factory As ClassFactory

больше не нужны?
Т.е. как понять, что не нужна больше ф-ка классов ?? Не знаю. Этот вопрос аналогичен такому: "Как понять, что приложение больше не будет создавать объектов ?"
Вы можете:
а) внутри ClassFactory вести свои счетчики созданых объектов. Только придется предположить, что _ссылки_ создаются только через ClassFactory
б) ввести свой метод который будет выставлять ClassFactory в Nothing, когда вы сочтете это необходимым. Т.е. то, что вы предлагали.

Я бы не заморачивался с этим. Создали объект, попользовались, выставили в Nothing. А ClassFactory пускай живет.
...
Рейтинг: 0 / 0
19.01.2005, 15:58:11
    #32872748
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
Alexey KudinovВы можете:
а) внутри ClassFactory вести свои счетчики созданых объектов. Только придется предположить, что _ссылки_ создаются только через ClassFactory
и конечно набор методов декрементирующих эти счетчики при освобождении ссылок.

Не самый лучший вариант одним словом, т.к. он предполагает очень аккуратное использование вашей библиотеки и это ложится на программистов
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ActiveX Dll, корневой объект, есть ли доступ внутри DLL / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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