|
|
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
Есть Apartment threaded ActiveX Dll. Instancing корневого объекта – GlobalMultiUse. Такой объект создается автоматически при вызове клиентом его методов. Есть ли разумная техника использования методов такого типа объекта в частных (приватных) классах внутри DLL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 11:27:22 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
СдутыйШарикЕсть 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, но все таки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 12:05:12 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
За ответ спасибо. Этот корень должен выступать в роли «фабрики классов». Предполагается, что заявленные как PublicNotCreatable интерфейсы относительно стабильны. Хочется скрыть «стандартные» реализации, предоставив методы «фабричных» конструкторов. GlobalMuliUse класс на стороне клиента хорошо подходит для размещения таких методов. Проблема в том, что реализации внутри себя содержат те же интерфейсные переменные в качестве делегатов или скрытых членов, инициализируемых в стандартном конструкторе приватных классов. Возможно, это не очень умное проектирование, но сейчас хочется построить «единый механизм» обращения к функциям-конструкторам (хотя бы на уровне имен) внутри DLL и вне ее. Пока просматривается «теневой» стандартный модуль, на одноименные функции которого будут полагаться «фабричные» методы GlobalMultiUse – класса. Подумал, может кто что умнее присоветует… Вопрос можно переформулировать так. Пусть я создам рекомендованную Main с экземпляром переменной моего глобал-класса, и объявлю Main как стартовый для DLL. Вопрос – когда клиент обратиться к фабричному методу, определенному в глобал-классе – для него будет создан новый экземпляр, или система сообразит обратиться к закешированному в модуле, содержащем Main ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 12:56:38 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
СдутыйШарикВопрос – когда клиент обратиться к фабричному методу, определенному в глобал-классе – для него будет создан новый экземпляр, или система сообразит обратиться к закешированному в модуле, содержащем Main ? Будет создан новый :( По поводу фабрики классов - хороший подход, нормальный. Для того, чтобы и внутри и вне библиотеки был единый (по крайней мере внешне) подход к работе с ф-кой классов могу предложить следующее (возможно это вариация на тему того, что вы обозначили как " «теневой» стандартный модуль, на одноименные функции которого будут полагаться «фабричные» методы GlobalMultiUse – класса. "): Пусть есть класс-фабрика классов ClassFactory. Instancing у нее (внимание!) PublicNotCreatable, т.е. ее нельзя создать извне библиотеки (и это хорошо) В MainModule пишем Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. А вне библиотеки - к свойству GlobalMultyUse класса, хотя экземпляр ClassFactory будет одним и тем же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 13:25:30 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
Я подразумевал чуть иначе - в стандартном модуле обычная функция 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. Спасибо за ответы. Как будто картинка устоялась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 13:54:11 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
Вот еще подумал - Если DLL окажется Retained In Memory, то, наверно, потребуется писать дополнительный публичный клинап-метод для кешированных в модулях ДЛЛ объектов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 14:18:28 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
СдутыйШарикВот еще подумал - Если DLL окажется Retained In Memory, то, наверно, потребуется писать дополнительный публичный клинап-метод для кешированных в модулях ДЛЛ объектов? А зачем ? Объект освободится из памяти тогда, когда обнулится счетчик ссылок на него. Просто аккуратно устанавливайте в Nothing все объекты, когда они вам больше не нужны. Как внутри библиотеки, так и вне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 14:23:56 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
авторА зачем ? Объект освободится из памяти тогда, когда обнулится счетчик ссылок на него Для "нормального" Apartment Threaded DLL, как я понимаю, кешированный в локальном модуле ДЛЛ объект освободится по завершении клиентского приложения, в момент выгрузки ДЛЛ. Меняет ли это поведение флаг "Retained In Memory"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 14:48:45 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
СдутыйШарик авторА зачем ? Объект освободится из памяти тогда, когда обнулится счетчик ссылок на него Для "нормального" 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 15:16:03 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
до тестов мне прямо сейчас малость рановато. Как бы это все на русский перевсти до опыта... авторТ.о: Объект (мы говорим об экземпляре класса) освободится из памяти тогда, когда счетчик ссылок на него станут равным 0. Это легко проверить по поведению Class_Terminate то есть, если сделать так авторВ MainModule пишем Public Factory As ClassFactory Sub Main() Set Factory = New ClassFactory 'Теперь у нас есть экземпляр ф-ки классов, к которому можно обратится внутри библиотеки End Sub и не предусмотреть публичного клинап-метода, то автор... библиотека из памяти не выгрузится (в случае *обычного* VB приложения), даже если ни один ресурс из нее не используется. Это легко проверить по поведению Sub Main Я правильно Вас понял? Если да, то как разумно воспользоваться советом авторПросто аккуратно устанавливайте в Nothing все объекты, когда они вам больше не нужны внутри библиотеки? Как сидя внутри нее понять, что авторPublic Factory As ClassFactory больше не нужны? ЗЫ Истина где-то рядом. Осталось научиться разпознавать изображения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 15:37:11 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
СдутыйШарик внутри библиотеки? Как сидя внутри нее понять, что авторPublic Factory As ClassFactory больше не нужны? Т.е. как понять, что не нужна больше ф-ка классов ?? Не знаю. Этот вопрос аналогичен такому: "Как понять, что приложение больше не будет создавать объектов ?" Вы можете: а) внутри ClassFactory вести свои счетчики созданых объектов. Только придется предположить, что _ссылки_ создаются только через ClassFactory б) ввести свой метод который будет выставлять ClassFactory в Nothing, когда вы сочтете это необходимым. Т.е. то, что вы предлагали. Я бы не заморачивался с этим. Создали объект, попользовались, выставили в Nothing. А ClassFactory пускай живет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 15:53:18 |
|
||
|
ActiveX Dll, корневой объект, есть ли доступ внутри DLL
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovВы можете: а) внутри ClassFactory вести свои счетчики созданых объектов. Только придется предположить, что _ссылки_ создаются только через ClassFactory и конечно набор методов декрементирующих эти счетчики при освобождении ссылок. Не самый лучший вариант одним словом, т.к. он предполагает очень аккуратное использование вашей библиотеки и это ложится на программистов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 15:58:11 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=60&tid=2168324]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 331ms |

| 0 / 0 |
