Форум программистов, компьютерный форум, киберфорум
C++: COM, OLE, ActiveX
Войти
Регистрация
Восстановить пароль
 
 
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
1

Что делает CoLockObjectExternal?

09.09.2020, 22:24. Просмотров 439. Ответов 23
Метки нет (Все метки)

На MSDN описание совершенно непонятное. А Don Box вообще описывает это совершенно по-другому(и тоже непонятно).

Опираясь на описание из MSDN, я не понимаю, чем это отличается от AddRef.
А уж тем более, как эта функция может каким-то волшебным образом "залочить" объект.

Добавлено через 1 час 14 минут
Если используете у себя эту функцию, прошу поделиться, для чего используете.

Очень желаю понять назначение этой функции.

Надеюсь гуру откликнутся.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2020, 22:24
Ответы с готовыми решениями:

Не могу понять на что способен sort, и что делает его компаратор
Недавно мой знакомый рассказывал что-то про sort,говорил что с помощью него можно сортировать как...

Что в программе делает так, что процессор грузится на 100%?
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот...

Я не могу понять что делает данная программа. Точнее что делают функции используемые в это коде
#include <iostream> #include <Windows.h> #include <ctime> using namespace std; int g(int a, int...

Что это за знак >> прочитал что это сдвиг вправо? что он делает
int d=6, c=5,f; f = d >> c; cout<< f; вывод 0

23
4589 / 3087 / 1291
Регистрация: 07.05.2019
Сообщений: 9,528
Записей в блоге: 1
10.09.2020, 11:22 2
Цитата Сообщение от Хрисипп Посмотреть сообщение
Опираясь на описание из MSDN, я не понимаю, чем это отличается от AddRef.
А уж тем более, как эта функция может каким-то волшебным образом "залочить" объект.
Насколько я понял, она ещё блокирует от выгрузки процесс, в котором был создан этот объект. Или что-то типа того.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 13:16  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Насколько я понял, она ещё блокирует от выгрузки процесс, в котором был создан этот объект.
Но эту функцию же должен вызывать сам процесс, в котором этот объект находится.
Зачем ему это может быть нужно?

И тоже интересно. Как это вообще? Вот падает процесс, или вызывается TerminateProcess, или даже просто закрывается единственное окно программы -- что дальше, кто будет RPC вызовы выполнять? Ведь подразумевается, что процесс нужно держать в памяти для какого-то другого процесса?
0
2019 / 607 / 220
Регистрация: 10.02.2018
Сообщений: 1,387
10.09.2020, 13:38 4
Вот тут есть немного про эту функцию, может что прояснится: "Сущность технологии СОМ. Библиотека программиста". Пролистайте текст до вашей функции.

Я так понял, что это всё из области DCOM (Distributed COM) и как-то используется в контексте мониторинга за удалённым (от слова даль, а не удалить) объектом из стороннего процесса. Сам с этим не сталкивался, всё время использовал только объекты живущие в контексте приложения (CLSCTX_INPROC_SERVER), так что помощи от меня не много будет.
0
4589 / 3087 / 1291
Регистрация: 07.05.2019
Сообщений: 9,528
Записей в блоге: 1
10.09.2020, 16:31 5
Цитата Сообщение от Хрисипп Посмотреть сообщение
И тоже интересно. Как это вообще? Вот падает процесс, или вызывается TerminateProcess, или даже просто закрывается единственное окно программы -- что дальше, кто будет RPC вызовы выполнять? Ведь подразумевается, что процесс нужно держать в памяти для какого-то другого процесса?
Вряд ли кто-то рассчитывает что твой процесс будет падать или вызывать TerminateProcess. Нормальные процессы-серверы обычно так не делают.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 16:49  [ТС] 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Вряд ли кто-то рассчитывает что твой процесс будет падать или вызывать TerminateProcess.
А по какой еще причине может произойти "выгрузка процесса"?
0
4589 / 3087 / 1291
Регистрация: 07.05.2019
Сообщений: 9,528
Записей в блоге: 1
10.09.2020, 16:56 7
Цитата Сообщение от Хрисипп Посмотреть сообщение
А по какой еще причине может произойти "выгрузка процесса"?
Скорее всего, процесс тупо не будет завершаться, пока кто-то ссылается на объекты, созданные в нём.
Но, я тоже слабо в этом разбираюсь. Зачем тебе это вообще понадобилось? В большинстве случаев безо всего этого можно обойтись.
0
2019 / 607 / 220
Регистрация: 10.02.2018
Сообщений: 1,387
10.09.2020, 17:09 8
---
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 17:11  [ТС] 9
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Зачем тебе это вообще понадобилось?
Я работаю над проектом, в котором это используется. Проект довольно старый, используется COM широко, и уже никто не в курсе для чего вся эта дичь.
0
2019 / 607 / 220
Регистрация: 10.02.2018
Сообщений: 1,387
10.09.2020, 17:22 10
Цитата Сообщение от Хрисипп Посмотреть сообщение
А по какой еще причине может произойти "выгрузка процесса"?
А как у вас организован запуск серверного процесса и какое у него время жизни?

В DCOM инициатором создания серверного объекта может быть клиент. Шлётся запрос к серверу, сервер запускает процесс заглушку, который загружает DLL с нужным COM-объектом и создаёт его. Соответственно, если клиент отключится или релизнет объект, то на сервере процесс-заглушка удалит объект и сам выгрузится. Если это как-то так работает, то данная функция может предотвратить выгрузку серверного объекта при отключении от него клиентов.
0
4589 / 3087 / 1291
Регистрация: 07.05.2019
Сообщений: 9,528
Записей в блоге: 1
10.09.2020, 17:44 11
Цитата Сообщение от Хрисипп Посмотреть сообщение
Я работаю над проектом, в котором это используется. Проект довольно старый, используется COM широко, и уже никто не в курсе для чего вся эта дичь.
В общем, это сервер не даёт выгрузить себя из памяти, завершить свой процесс. Если у тебя это уже сделано, то просто не заморачивайся, оставь.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 17:48  [ТС] 12
Цитата Сообщение от Ygg Посмотреть сообщение
А как у вас организован запуск серверного процесса и какое у него время жизни?
Запуск из клиента или напрямую.

Цитата Сообщение от Ygg Посмотреть сообщение
Если это как-то так работает, то данная функция может предотвратить выгрузку серверного объекта при отключении от него клиентов.
Да, видимо для этого почему-то тоже используется. Тогда не понятно -- а чем AddRef плох?

Еще CoLockObjectExternal используется в реализации IExternalConnection, но уже не для серверного объекта, а для некоторых других. Серверный объект тоже наследуется от IExternalConnection, но в AddConnection используется AddRef.
0
2019 / 607 / 220
Регистрация: 10.02.2018
Сообщений: 1,387
10.09.2020, 18:31 13
Цитата Сообщение от Хрисипп Посмотреть сообщение
Да, видимо для этого почему-то тоже используется. Тогда не понятно -- а чем AddRef плох?
В той книге, на которую я раньше ссылался, на странице 18 немного рассказывается об администраторе заглушек.
Цитата от туда
Между администраторами заглушек и идентификационными единицами СОМ-объектов имеется взаимно однозначное соответствие. Каждый администратор заглушек ссылается на ровно один СОМ-объект. Каждый СОМ-объект, использующий стандартный маршалинг, будет иметь ровно один администратор заглушек. Администратор заглушек содержит но крайней мере одну неосвобожденную ссылку на объект, которая удерживает ресурсы объекта в памяти. В этом смысле администратор заглушек является еще одним внутрипроцессным клиентом для объекта. Администратор заглушек следит за числом неосвобожденных внешних ссылок и будет существовать до тех пор, пока где-либо в сети останется хотя бы одна неосвобожденная ссылка. Большинство внешних ссылок являются просто заместителями, хотя промежуточные маршалированные объектные ссылки могут удерживать заглушки, чтобы быть уверенными, что в момент создания первого заместителя объект еще существует. Когда неосвобожденные заместители или ссылки уничтожаются, администратор заглушек извещается об этом и декрементирует свой счетчик внешних ссылок. Если уничтожена последняя внешняя ссылка на администратор заглушек, то последний самоуничтожается, освобождая свои неосвобожденные ссылки на действующий объект. Это имитирует эффект наличия на стороне клиента ссылок, поддерживающих объект.

(возможно, дальше будет полёт моей фантазии и он не очень соответствует реальности)
Как я понимаю, в некоторых случаях ваш объект получается размазан по нескольким местам. Во-первых, есть объект с вашей реализацией. Во-вторых, у пользователя объекта есть его прокси копия (заместитель). В-третьих, есть ещё заглушка, которая содержит в себе реальный объект с реализацией (1) и обеспечивает его взаимодействие с заместителями (2). Заместители и заглушки получаются автоматически, это не ваш код, а среда исполнения COM. AddRef вы можете сделать только из пользовательской программы или из реализации объекта. Вызов из пользовательской программы естественно увеличит счётчик и предотвратит выгрузку. Но вас интересует вызов из реализации, а он лишь выполнит увеличение локального счётчика ссылок. Администратор заглушек про него ничего знать не знает и ему на него по большому счёту плевать. У него свой счётчик, основанный на заместителях. Поэтому, когда последний заместитель вызовет релиз, администратор самоудалится вместе с объектом. Вот как раз что бы избежать этого, реализация может вызвать эту самую CoLockObjectExternal.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 19:12  [ТС] 14
Цитата Сообщение от Ygg Посмотреть сообщение
Поэтому, когда последний заместитель вызовет релиз, администратор самоудалится вместе с объектом.
Ну как же с объектом. Администратор же вызовет Release у объекта, а у нас будет оставаться еще одна ссылка(AddRef из реализации), и никуда объект не денется. Так ведь?
0
2019 / 607 / 220
Регистрация: 10.02.2018
Сообщений: 1,387
10.09.2020, 19:40 15
Цитата Сообщение от Хрисипп Посмотреть сообщение
Ну как же с объектом. Администратор же вызовет Release у объекта, а у нас будет оставаться еще одна ссылка(AddRef из реализации), и никуда объект не денется. Так ведь?
Это уже вопрос устройства администратора. Если администратор интегрирован в пользовательский процесс, то, скорее всего, именно так, как вы говорите, объект останется живым. Если же администратор является отдельным процессом, то время его жизни закончилось и вместе с его закрытием умрут все объекты и потоки. Плюсом к этому могут идти какие-нибудь хитрые связки различных объектов, когда релиз одного приводит к релизу связанных с ним. В документации msdn в описании функции что-то говорилось про использовании с OLE-контейнерами, но я там не сильно что-то понял. Короче, по правильному получается на критическую работу внутри объекта, если она не должна прерываться внешним релизом, лучше сделать блокировку CoLockObjectExternal, а не AddRef. После завершения критической обработки разблокировать тем же CoLockObjectExternal, что запустит штатную процедуру удаления объекта.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 20:05  [ТС] 16
Цитата Сообщение от Ygg Посмотреть сообщение
Если же администратор является отдельным процессом, то время его жизни закончилось и вместе с его закрытием умрут все объекты и потоки.
Что-то я не понимаю. Как это объекты умрут? Объект же нельзя просто уничтожить(по крайней мере вне реализации). Все вне реализации могут сделать либо AddRef, либо Release. Или я чего-то не понимаю?
0
4589 / 3087 / 1291
Регистрация: 07.05.2019
Сообщений: 9,528
Записей в блоге: 1
10.09.2020, 20:18 17
Цитата Сообщение от Хрисипп Посмотреть сообщение
Что-то я не понимаю. Как это объекты умрут? Объект же нельзя просто уничтожить(по крайней мере вне реализации). Все вне реализации могут сделать либо AddRef, либо Release. Или я чего-то не понимаю?
Ты забываешь, что DCOM это распределённая система. Объекты могут существовать не только в разных процессах, но и на разных машинах. Сценариев взаимодействия между ними, поддержки коннекта и т.д., довольно много. В некоторых конечный, удалённый, объект может быть закрыт, когда к нему долго нет обращения. Чтобы это предотвратить сервер блокирует себя.

Добавлено через 2 минуты
Там по ссылке приведён пример с методами StartMonotor/StopMonitor. Эти методы могут вызываться один утром, второй завтра. Между вызовами ними никаких обращений к серверу не будет, т.е. система запросто может решить, что сервер не используется и его можно погасить.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 20:36  [ТС] 18
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В некоторых конечный, удалённый, объект может быть закрыт, когда к нему долго нет обращения.
Так а как это произойдет, если имеется еще лишний AddRef(вызванный из реализации)?

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
система запросто может решить, что сервер не используется и его можно погасить.
Типа TerminateProcess сделать? Или как? Каким образом "погасить"?
0
4589 / 3087 / 1291
Регистрация: 07.05.2019
Сообщений: 9,528
Записей в блоге: 1
10.09.2020, 20:37 19
Цитата Сообщение от Хрисипп Посмотреть сообщение
Так а как это произойдет, если имеется еще лишний AddRef(вызванный из реализации)?
Этот AddRef вызывается на клиенте. До сервера там довольно далеко.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
10.09.2020, 20:44  [ТС] 20
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Этот AddRef вызывается на клиенте. До сервера там довольно далеко.
Почему на клиенте?
Речь же идет о том, чтобы заменить вызов CoLockObjectExternal на AddRef, т.е. на сервере.
CoLockObjectExternal можно же вызвать только на сервере(где объект был создан/обитает).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2020, 20:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Дать понять пользователю, что программа что-то делает, а не зависла
Написал программу для поиска текста в файлах, но т.к. файлов много программа "зависает" на время...

что такое super.onCreate(savedInstanceState);? что оно делает?
подскажите, начинающему программисту под android, что делает строка...

Какова вероятность того, что родители увидят, что сын делает уроки
Ученику нужно сделать 5 предметов. 10% рабочего времени он тратит на Физику, 20% - на Биологию, 25%...

Добрый вечер. move_uploaded_file делает не совсем то, что мне нужно, что я сделал не так?
Хочу сохранить файл в папку uploads, лежащую в корневой директории сайта. Но вместо этого файл (мп3...

WorksheetFunction - что за функция в VBA, что она делает
WorksheetFunction - что за функция в VBA, что она делает ?

Что за оператор такой string replace и что он делает?
Что за оператор такой string replace и что он делает???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.