Как получить интерфейс у приложения, запущенного дважды?
От: Аноним  
Дата: 16.04.10 11:04
Оценка:
Есть приложение, которое запущено несколько раз. Нужно получить интерфейс от каждого из них.
Re: Как получить интерфейс у приложения, запущенного дважды?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.04.10 12:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Есть приложение, которое запущено несколько раз. Нужно получить интерфейс от каждого из них.


С помощью СОМ это невозможно, если само приложение не поспособствует. Потому что Одинаковость активных объектов из ROT
Автор: Vi2
Дата: 14.07.03
.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Как получить интерфейс у приложения, запущенного дваж
От: Аноним  
Дата: 20.04.10 08:08
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Аноним, Вы писали:


А>> Есть приложение, которое запущено несколько раз. Нужно получить интерфейс от каждого из них.


Vi2>С помощью СОМ это невозможно, если само приложение не поспособствует. Потому что Одинаковость активных объектов из ROT
Автор: Vi2
Дата: 14.07.03
.


Получается, что мне нужно сделать еще интерфейс(пусть будет IManager), в котором будут все указатели интерфейсов приложений, запущенных несколько раз. А в приложениях в конструкторе компонента(или при запросе интерфейса) надо будет добавлять указатель в список IManagerа, а деструкторе удалять. И передача указателей через IManager происходить должа через маршалинг. Примерно так?
Re[3]: Как получить интерфейс у приложения, запущенного дваж
От: Vi2 Удмуртия http://www.adem.ru
Дата: 20.04.10 10:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Получается, что мне нужно сделать еще интерфейс(пусть будет IManager), в котором будут все указатели интерфейсов приложений, запущенных несколько раз. А в приложениях в конструкторе компонента(или при запросе интерфейса) надо будет добавлять указатель в список IManagerа, а деструкторе удалять. И передача указателей через IManager происходить должа через маршалинг. Примерно так?


Если регистрация делается тобой, то в кодах ошибок RegisterActiveObject написано следующее:

Return value........Meaning
S_OK................Success.
Other return codes..Failure.

В частности, возвращается такой код

// MessageId: MK_S_MONIKERALREADYREGISTERED
//
// MessageText:
//
// Moniker is already registered in running object table
//
#define MK_S_MONIKERALREADYREGISTERED _HRESULT_TYPEDEF_(0x000401E7L)

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

Вариантов исправления ситуации много, но ни одна не будет поддержана GetActiveObject для клиентов (если только не будет достигнуто соглашение по параметру REFCLSID rclsid).

Возвращаясь к предложенному тобой, где-то как-то так, но тут сложность в объекте, который будет реализовывать IManager. Он должен быть синглетоном, т.е. одним в системе и не принадлежать ни одному из используемых приложений, создаваться безопасно для конкурирующих приложений и не держать запущенные объекты. Маршаллинг, если он тебя беспокоит, ничем не отличается от обычной передачи объектов в СОМе.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Как получить интерфейс у приложения, запущенного дваж
От: Jolly Roger  
Дата: 21.04.10 05:51
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Аноним, Вы писали:


Vi2>В частности, возвращается такой код

Vi2>

Vi2>// MessageId: MK_S_MONIKERALREADYREGISTERED
Vi2>//
Vi2>// MessageText:
Vi2>//
Vi2>// Moniker is already registered in running object table
Vi2>//
Vi2>#define MK_S_MONIKERALREADYREGISTERED _HRESULT_TYPEDEF_(0x000401E7L)

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

Могу ошибаться за давностью, но насколько помню, регистрация нескольких экземпляров одного класса пороходила успешно, при этом доступным через GetActiveObject становился последний зарегистрированный. Когда он удалялся, доступным становился предыдущий и т.д., то есть получалось нечто вроде стека. А ошибка возвращалась при попытке дважды зарегистрировать один и тот-же экземпляр.

Впрочем, для топикстартера это вряд-ли что меняет.
"Нормальные герои всегда идут в обход!"
Re[5]: Как получить интерфейс у приложения, запущенного дваж
От: Vi2 Удмуртия http://www.adem.ru
Дата: 21.04.10 10:53
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Могу ошибаться за давностью, но насколько помню, регистрация нескольких экземпляров одного класса проходила успешно, при этом доступным через GetActiveObject становился последний зарегистрированный. Когда он удалялся, доступным становился предыдущий и т.д., то есть получалось нечто вроде стека.


Код MK_S_MONIKERALREADYREGISTERED является успешным, т.е. SUCCEEDED(MK_S_MONIKERALREADYREGISTERED) вычисляется в истину, но нужно смотреть описание функции, и ее требование однозначно. Я его приводил в исходном посте.

JR>А ошибка возвращалась при попытке дважды зарегистрировать один и тот-же экземпляр.


Этот код возвращается даже в пределах одного приложения, т.е. "при попытке дважды зарегистрировать один и тот-же экземпляр".
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Как получить интерфейс у приложения, запущенного дважды?
От: Other Sam Россия  
Дата: 21.04.10 14:49
Оценка:
On 04/16/2010 06:04 PM, Аноним 105 wrote:
> Есть приложение, которое запущено несколько раз. Нужно получить
> интерфейс от каждого из них.

Приложение использует некий COM-объект который является менеджером
запущеных приложений. Каждая копия приложения передает менеджеру
какой-то свой интерфейс (при старте), а при завершении прекращает
регистрацию.

Только обычные COM указатели не подойдут, т.к. менеджер в таком случае
будет блокировать приложения. Так что либо подсчет ссылок реализовывать
как-то по-хитрому (при количестве ссылок = 1 запрашивать у менеджера
разрешение на выгрузку, при этом менеджер будет освобождать ссылку и
приложение выгрузится). Либо использовать какие-то другие IPC.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Как получить интерфейс у приложения, запущенного дваж
От: Vi2 Удмуртия http://www.adem.ru
Дата: 21.04.10 16:18
Оценка:
Здравствуйте, Other Sam, Вы писали:

OS>Приложение использует некий COM-объект который является менеджером запущеных приложений. Каждая копия приложения передает менеджеру какой-то свой интерфейс (при старте), а при завершении прекращает регистрацию.


OS>Только обычные COM указатели не подойдут, т.к. менеджер в таком случае будет блокировать приложения. Так что либо подсчет ссылок реализовывать как-то по-хитрому (при количестве ссылок = 1 запрашивать у менеджера разрешение на выгрузку, при этом менеджер будет освобождать ссылку и приложение выгрузится). Либо использовать какие-то другие IPC.


Есть решение в Re: Коллекция глобальных обьектов
Автор: Vi2
Дата: 15.06.05
или поиск OBJREF.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: Как получить интерфейс у приложения, запущенного дваж
От: Jolly Roger  
Дата: 22.04.10 01:38
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Код MK_S_MONIKERALREADYREGISTERED является успешным, т.е. SUCCEEDED(MK_S_MONIKERALREADYREGISTERED) вычисляется в истину, но нужно смотреть описание функции, и ее требование однозначно. Я его приводил в исходном посте.


Vi2>Этот код возвращается даже в пределах одного приложения, т.е. "при попытке дважды зарегистрировать один и тот-же экземпляр".


Да, не обратил внимания на _S_, да и давно последний раз имел с этим дело. Я к тому писал, что сохранить в ROT несколько однотипных объектов всё-таки возможно, хоть из одного, хоть из нескольких приложений. Насчёт многократного сохранения одного экземпляра — видимо так, я просто не помню. А что до требований к функции — так описание люди пишут. И на Солнце бывают пятна, и в MSDN — неточности и ошибки
"Нормальные герои всегда идут в обход!"
Re[7]: Как получить интерфейс у приложения, запущенного дваж
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.04.10 06:18
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Я к тому писал, что сохранить в ROT несколько однотипных объектов всё-таки возможно, хоть из одного, хоть из нескольких приложений.


Синтаксически — да, возможно, т.к. функция отработает, объект будет зарегистрирован в ROT. Но семантически — нет, не возможно, т.к. объект не будет Активным объектом. На что и обращают внимание посты вляпавшихся в это дело. Так что не совсем "пятна" и "неточности и ошибки".
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: Как получить интерфейс у приложения, запущенного дваж
От: Jolly Roger  
Дата: 22.04.10 07:58
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Но семантически — нет, не возможно, т.к. объект не будет Активным объектом.


А каким он будет?
"Нормальные герои всегда идут в обход!"
Re[3]: Как получить интерфейс у приложения, запущенного дваж
От: Jolly Roger  
Дата: 22.04.10 08:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Получается, что мне нужно сделать еще интерфейс(пусть будет IManager), в котором будут все указатели интерфейсов приложений, запущенных несколько раз. А в приложениях в конструкторе компонента(или при запросе интерфейса) надо будет добавлять указатель в список IManagerа, а деструкторе удалять. И передача указателей через IManager происходить должа через маршалинг. Примерно так?


Вам принципиально использовать обёртки RegisterActiveObject и GetActiveObject? Потому как если спуститься до уровня IRunningObjectTable, то Ваша задача решается довольно просто. Создаёте уникальную строку для моникёра, что-нибудь типа "CurrentProcessId-CLSID_MYOBJ" и регистрируете вызовом IRunningObjectTable::Register. На клиенте получаете енумератор (IRunningObjectTable::EnumRunning), перебираете моникёры, получаете их строки (IMoniker::GetDisplayName) и ищите в них строку с CLSID Вашего объекто. Нашли — значит это Ваш объект. Теперь его можно получить вызовом IRunningObjectTable::GetObject.
"Нормальные герои всегда идут в обход!"
Re[9]: Как получить интерфейс у приложения, запущенного дваж
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.04.10 09:13
Оценка: :)
Здравствуйте, Jolly Roger, Вы писали:

JR>А каким он будет?


Ну если GetActiveObject не выдает его, то он Активным быть не может.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.