19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
1 | |
Что делает CoLockObjectExternal?09.09.2020, 22:24. Показов 39003. Ответов 23
Метки нет (Все метки)
На MSDN описание совершенно непонятное. А Don Box вообще описывает это совершенно по-другому(и тоже непонятно).
Опираясь на описание из MSDN, я не понимаю, чем это отличается от AddRef. А уж тем более, как эта функция может каким-то волшебным образом "залочить" объект. Добавлено через 1 час 14 минут Если используете у себя эту функцию, прошу поделиться, для чего используете. Очень желаю понять назначение этой функции. Надеюсь гуру откликнутся.
0
|
09.09.2020, 22:24 | |
Ответы с готовыми решениями:
23
Не могу понять на что способен sort, и что делает его компаратор Что в программе делает так, что процессор грузится на 100%? Я не могу понять что делает данная программа. Точнее что делают функции используемые в это коде Что это за знак >> прочитал что это сдвиг вправо? что он делает |
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
10.09.2020, 11:22 | 2 |
Насколько я понял, она ещё блокирует от выгрузки процесс, в котором был создан этот объект. Или что-то типа того.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 13:16 [ТС] | 3 |
Но эту функцию же должен вызывать сам процесс, в котором этот объект находится.
Зачем ему это может быть нужно? И тоже интересно. Как это вообще? Вот падает процесс, или вызывается TerminateProcess, или даже просто закрывается единственное окно программы -- что дальше, кто будет RPC вызовы выполнять? Ведь подразумевается, что процесс нужно держать в памяти для какого-то другого процесса?
0
|
2521 / 853 / 321
Регистрация: 10.02.2018
Сообщений: 2,001
|
|
10.09.2020, 13:38 | 4 |
Вот тут есть немного про эту функцию, может что прояснится: "Сущность технологии СОМ. Библиотека программиста". Пролистайте текст до вашей функции.
Я так понял, что это всё из области DCOM (Distributed COM) и как-то используется в контексте мониторинга за удалённым (от слова даль, а не удалить) объектом из стороннего процесса. Сам с этим не сталкивался, всё время использовал только объекты живущие в контексте приложения (CLSCTX_INPROC_SERVER), так что помощи от меня не много будет. Добавлено через 6 секунд Вот тут есть немного про эту функцию, может что прояснится: "Сущность технологии СОМ. Библиотека программиста". Пролистайте текст до вашей функции. Я так понял, что это всё из области DCOM (Distributed COM) и как-то используется в контексте мониторинга за удалённым (от слова даль, а не удалить) объектом из стороннего процесса. Сам с этим не сталкивался, всё время использовал только объекты живущие в контексте приложения (CLSCTX_INPROC_SERVER), так что помощи от меня не много будет.
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
10.09.2020, 16:31 | 5 |
Вряд ли кто-то рассчитывает что твой процесс будет падать или вызывать TerminateProcess. Нормальные процессы-серверы обычно так не делают.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 16:49 [ТС] | 6 |
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
10.09.2020, 16:56 | 7 |
Скорее всего, процесс тупо не будет завершаться, пока кто-то ссылается на объекты, созданные в нём.
Но, я тоже слабо в этом разбираюсь. Зачем тебе это вообще понадобилось? В большинстве случаев безо всего этого можно обойтись.
0
|
2521 / 853 / 321
Регистрация: 10.02.2018
Сообщений: 2,001
|
|
10.09.2020, 17:09 | 8 |
---
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 17:11 [ТС] | 9 |
Я работаю над проектом, в котором это используется. Проект довольно старый, используется COM широко, и уже никто не в курсе для чего вся эта дичь.
0
|
2521 / 853 / 321
Регистрация: 10.02.2018
Сообщений: 2,001
|
|
10.09.2020, 17:22 | 10 |
А как у вас организован запуск серверного процесса и какое у него время жизни?
В DCOM инициатором создания серверного объекта может быть клиент. Шлётся запрос к серверу, сервер запускает процесс заглушку, который загружает DLL с нужным COM-объектом и создаёт его. Соответственно, если клиент отключится или релизнет объект, то на сервере процесс-заглушка удалит объект и сам выгрузится. Если это как-то так работает, то данная функция может предотвратить выгрузку серверного объекта при отключении от него клиентов.
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
10.09.2020, 17:44 | 11 |
В общем, это сервер не даёт выгрузить себя из памяти, завершить свой процесс. Если у тебя это уже сделано, то просто не заморачивайся, оставь.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 17:48 [ТС] | 12 |
Запуск из клиента или напрямую.
Да, видимо для этого почему-то тоже используется. Тогда не понятно -- а чем AddRef плох?Еще CoLockObjectExternal используется в реализации IExternalConnection , но уже не для серверного объекта, а для некоторых других. Серверный объект тоже наследуется от IExternalConnection , но в AddConnection используется AddRef .
0
|
2521 / 853 / 321
Регистрация: 10.02.2018
Сообщений: 2,001
|
|
10.09.2020, 18:31 | 13 |
В той книге, на которую я раньше ссылался, на странице 18 немного рассказывается об администраторе заглушек.
Цитата от туда
Между администраторами заглушек и идентификационными единицами СОМ-объектов имеется взаимно однозначное соответствие. Каждый администратор заглушек ссылается на ровно один СОМ-объект. Каждый СОМ-объект, использующий стандартный маршалинг, будет иметь ровно один администратор заглушек. Администратор заглушек содержит но крайней мере одну неосвобожденную ссылку на объект, которая удерживает ресурсы объекта в памяти. В этом смысле администратор заглушек является еще одним внутрипроцессным клиентом для объекта. Администратор заглушек следит за числом неосвобожденных внешних ссылок и будет существовать до тех пор, пока где-либо в сети останется хотя бы одна неосвобожденная ссылка. Большинство внешних ссылок являются просто заместителями, хотя промежуточные маршалированные объектные ссылки могут удерживать заглушки, чтобы быть уверенными, что в момент создания первого заместителя объект еще существует. Когда неосвобожденные заместители или ссылки уничтожаются, администратор заглушек извещается об этом и декрементирует свой счетчик внешних ссылок. Если уничтожена последняя внешняя ссылка на администратор заглушек, то последний самоуничтожается, освобождая свои неосвобожденные ссылки на действующий объект. Это имитирует эффект наличия на стороне клиента ссылок, поддерживающих объект.
(возможно, дальше будет полёт моей фантазии и он не очень соответствует реальности) Как я понимаю, в некоторых случаях ваш объект получается размазан по нескольким местам. Во-первых, есть объект с вашей реализацией. Во-вторых, у пользователя объекта есть его прокси копия (заместитель). В-третьих, есть ещё заглушка, которая содержит в себе реальный объект с реализацией (1) и обеспечивает его взаимодействие с заместителями (2). Заместители и заглушки получаются автоматически, это не ваш код, а среда исполнения COM. AddRef вы можете сделать только из пользовательской программы или из реализации объекта. Вызов из пользовательской программы естественно увеличит счётчик и предотвратит выгрузку. Но вас интересует вызов из реализации, а он лишь выполнит увеличение локального счётчика ссылок. Администратор заглушек про него ничего знать не знает и ему на него по большому счёту плевать. У него свой счётчик, основанный на заместителях. Поэтому, когда последний заместитель вызовет релиз, администратор самоудалится вместе с объектом. Вот как раз что бы избежать этого, реализация может вызвать эту самую CoLockObjectExternal.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 19:12 [ТС] | 14 |
Ну как же с объектом. Администратор же вызовет Release у объекта, а у нас будет оставаться еще одна ссылка(AddRef из реализации), и никуда объект не денется. Так ведь?
0
|
2521 / 853 / 321
Регистрация: 10.02.2018
Сообщений: 2,001
|
|
10.09.2020, 19:40 | 15 |
Это уже вопрос устройства администратора. Если администратор интегрирован в пользовательский процесс, то, скорее всего, именно так, как вы говорите, объект останется живым. Если же администратор является отдельным процессом, то время его жизни закончилось и вместе с его закрытием умрут все объекты и потоки. Плюсом к этому могут идти какие-нибудь хитрые связки различных объектов, когда релиз одного приводит к релизу связанных с ним. В документации msdn в описании функции что-то говорилось про использовании с OLE-контейнерами, но я там не сильно что-то понял. Короче, по правильному получается на критическую работу внутри объекта, если она не должна прерываться внешним релизом, лучше сделать блокировку CoLockObjectExternal, а не AddRef. После завершения критической обработки разблокировать тем же CoLockObjectExternal, что запустит штатную процедуру удаления объекта.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 20:05 [ТС] | 16 |
Что-то я не понимаю. Как это объекты умрут? Объект же нельзя просто уничтожить(по крайней мере вне реализации). Все вне реализации могут сделать либо AddRef, либо Release. Или я чего-то не понимаю?
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
10.09.2020, 20:18 | 17 |
Ты забываешь, что DCOM это распределённая система. Объекты могут существовать не только в разных процессах, но и на разных машинах. Сценариев взаимодействия между ними, поддержки коннекта и т.д., довольно много. В некоторых конечный, удалённый, объект может быть закрыт, когда к нему долго нет обращения. Чтобы это предотвратить сервер блокирует себя.
Добавлено через 2 минуты Там по ссылке приведён пример с методами StartMonotor/StopMonitor. Эти методы могут вызываться один утром, второй завтра. Между вызовами ними никаких обращений к серверу не будет, т.е. система запросто может решить, что сервер не используется и его можно погасить.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 20:36 [ТС] | 18 |
Так а как это произойдет, если имеется еще лишний AddRef(вызванный из реализации)?
Типа TerminateProcess сделать? Или как? Каким образом "погасить"?
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
10.09.2020, 20:37 | 19 |
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
10.09.2020, 20:44 [ТС] | 20 |
Почему на клиенте?
Речь же идет о том, чтобы заменить вызов CoLockObjectExternal на AddRef , т.е. на сервере. CoLockObjectExternal можно же вызвать только на сервере(где объект был создан/обитает).
0
|
10.09.2020, 20:44 | |
10.09.2020, 20:44 | |
Помогаю со студенческими работами здесь
20
Дать понять пользователю, что программа что-то делает, а не зависла что такое super.onCreate(savedInstanceState);? что оно делает? Какова вероятность того, что родители увидят, что сын делает уроки Добрый вечер. move_uploaded_file делает не совсем то, что мне нужно, что я сделал не так? WorksheetFunction - что за функция в VBA, что она делает Что за оператор такой string replace и что он делает? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |