Возникла следующая нетривиальная задача (для меня нетривиальная).
Есть некий объект который реализует интерфейс IDataObject. При вызове его метода нужно определить кто вызвал объект, а имнно PID процесса в котором сидит proxy вызвавший метод объекта.
Как я вижу решение этой проблемы:
При поступлении вызова например GetData определяем соответствующий stub объект. Если staub объекта нету то вызов произошел из нашего аппартамента
У stub'а запрашиваем соответствующий ему proxy .. вернее даже не сам proxy а тот аппартамент в котором сидит этот proxy
У аппартамента определяем в каком процессе он находится. Принадлежность MTA, STA, primary STA для меня роли не играет .. главное где он сидит
Здравствуйте, _BOBAH_, Вы писали:
_BO>Привет всем знатокам СOM'а !
_BO>Возникла следующая нетривиальная задача (для меня нетривиальная). _BO>Есть некий объект который реализует интерфейс IDataObject. При вызове его метода нужно определить кто вызвал объект, а имнно PID процесса в котором сидит proxy вызвавший метод объекта. _BO>Как я вижу решение этой проблемы: _BO>
_BO> При поступлении вызова например GetData определяем соответствующий stub объект. Если staub объекта нету то вызов произошел из нашего аппартамента _BO> У stub'а запрашиваем соответствующий ему proxy .. вернее даже не сам proxy а тот аппартамент в котором сидит этот proxy _BO> У аппартамента определяем в каком процессе он находится. Принадлежность MTA, STA, primary STA для меня роли не играет .. главное где он сидит _BO>
апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.
_BO>Как можно решить эту задачу?
Здравствуйте, Константин Л., Вы писали:
КЛ>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.
Мне не надо в TLS лезть потому что во первых он ничего мне не даст во вторых тот который мне нужен находится в другом потоке и возможно даже в другом процессе
_BO>>Как можно решить эту задачу?
КЛ>Зачем тебе это? Че-то похоже на кривость дизайна
Если не знаешь как ответить зачем флейм разводить?? Мое дело зачем!! Раз спрашиваю, значит это действительно мне нужно, и это я решил не просто так потому-что "похоже на кривость дизайна", а потому что действительно мне так нужно!! Честно говоря начинает бесить .. периодически такие "умники" выскакивают ... хочется поговорить то это не сюда
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, _BOBAH_, Вы писали:
скипано.
КЛ>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.
_BO>>Как можно решить эту задачу?
КЛ>Зачем тебе это? Че-то похоже на кривость дизайна
всё дело в том, мой юный друг, что на свете бывают задачи, о существовании которых, ты, к сожалению, даже не подозреваешь.
насколько я понял задачу — изначально нужно было получить PID процесса клиента. знание apartmentid ее решить не поможет.
чтобы получить PID клиента есть как минимум 2 варианта —
— channel hooks, CoRegisterChannelHook, http://www.microsoft.com/msj/0198/activex0198.aspx
— custom marshaling. в своих proxy/stub можно добавлять нужную информацию при маршалинге
как правило afaik используется первый вариант, т.к. он более универсальный
Здравствуйте, _BOBAH_, Вы писали:
_BO>Здравствуйте, Константин Л., Вы писали:
КЛ>>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.
_BO>Мне не надо в TLS лезть потому что во первых он ничего мне не даст во вторых тот который мне нужен находится в другом потоке и возможно даже в другом процессе
а я тебе говорю, что эту информацию ты сможешь получить только из того потока, apartment которого тебе нужно узнать.
_BO>>>Как можно решить эту задачу?
КЛ>>Зачем тебе это? Че-то похоже на кривость дизайна
_BO>Если не знаешь как ответить зачем флейм разводить?? Мое дело зачем!! Раз спрашиваю, значит это действительно мне нужно, и это я решил не просто так потому-что "похоже на кривость дизайна", а потому что действительно мне так нужно!! Честно говоря начинает бесить .. периодически такие "умники" выскакивают ... хочется поговорить то это не сюда
Вам помочь пытаюсь, вам. Может быть есть другой способ добиться желаемого результата. Всего-лишь прошу объяснить надобность. Может по-другому проблему решить можно. Кроме того, именно ты спрашиваешь, поэтому если хочешь получить ответ, будь любезнее... хамить то зачем?
I>насколько я понял задачу — изначально нужно было получить PID процесса клиента. знание apartmentid ее решить не поможет.
I>чтобы получить PID клиента есть как минимум 2 варианта - I>- channel hooks, CoRegisterChannelHook, http://www.microsoft.com/msj/0198/activex0198.aspx I>- custom marshaling. в своих proxy/stub можно добавлять нужную информацию при маршалинге
I>как правило afaik используется первый вариант, т.к. он более универсальный
Здравствуйте, AlikGut, Вы писали:
AG>Здравствуйте, Константин Л., Вы писали:
КЛ>>Здравствуйте, _BOBAH_, Вы писали:
AG>скипано.
КЛ>>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.
_BO>>>Как можно решить эту задачу?
КЛ>>Зачем тебе это? Че-то похоже на кривость дизайна
AG> всё дело в том, мой юный друг, что на свете бывают задачи, о существовании которых, ты, к сожалению, даже не подозреваешь.
спасибо, о мой учитель, что просвятили, а я то и не знал
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, _BOBAH_, Вы писали:
_BO>>Здравствуйте, Константин Л., Вы писали:
КЛ>>>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.
_BO>>Мне не надо в TLS лезть потому что во первых он ничего мне не даст во вторых тот который мне нужен находится в другом потоке и возможно даже в другом процессе
КЛ>а я тебе говорю, что эту информацию ты сможешь получить только из того потока, apartment которого тебе нужно узнать.
КЛ>Вот еще ссылочка здесь
Ссылку видел уже, спасибо! Но не подходит она мне — тем более недокументированный способ .
_BO>>>>Как можно решить эту задачу?
КЛ>>>Зачем тебе это? Че-то похоже на кривость дизайна
_BO>>Если не знаешь как ответить зачем флейм разводить?? Мое дело зачем!! Раз спрашиваю, значит это действительно мне нужно, и это я решил не просто так потому-что "похоже на кривость дизайна", а потому что действительно мне так нужно!! Честно говоря начинает бесить .. периодически такие "умники" выскакивают ... хочется поговорить то это не сюда
КЛ>Вам помочь пытаюсь, вам. Может быть есть другой способ добиться желаемого результата. Всего-лишь прошу объяснить надобность. Может по-другому проблему решить можно. Кроме того, именно ты спрашиваешь, поэтому если хочешь получить ответ, будь любезнее... хамить то зачем?
Хамство тут не было .. накипело — когда вместо ответа тебе приходит вроде того что "кривой дизайн" или что-то вроде того. Если бы был вопрос по дизайну то это звучало бы примерно так
Вот мой код я наколбасил его. Оцените пожалуйста его правильность (кривизну) и тому подобное...
Сабж был четко обдуман прежде чем я его запостил, а дизайн построен четко в соответствии с требованиями, ничего лишнего все кратко правильно и лаконично ... но чтобы заработало так как требуется нужно решить поставленную задачу
[]
_BO> Сабж был четко обдуман прежде чем я его запостил, а дизайн построен четко в соответствии с требованиями, ничего лишнего все кратко правильно и лаконично ... но чтобы заработало так как требуется нужно решить поставленную задачу
говоря "кривой дизайн" я имел ввиду способ получения PID.
Похожую проблему мы решали. Надо было знать о клиентах внепроцессного COM сервера.
Этот CIxPtr использовал каждый клиент и проблема определения pid была решена. Однако этот метод подходит не ко всем ситуациям. имхо, это проще чем CoRegisterChannelHook.
Поэтому и спросил про решаемую задачу.
_BO> Ничего личного
Здравствуйте, Константин Л., Вы писали:
КЛ>Этот CIxPtr использовал каждый клиент и проблема определения pid была решена. Однако этот метод подходит не ко всем ситуациям. имхо, это проще чем CoRegisterChannelHook. КЛ>Поэтому и спросил про решаемую задачу.
К сожалению не подходит для меня . Есть реализвация стандартного интерфейса IDataObject и в некоторых методах нужно определить кто их вызывает. И еще одно требование такое что модуль (dll) осуществляющий данный финт ушами не должен регистрироваться в реестре так как вполне возможна ситуация когда доступ к HKLM будет закрыт (под гостем). Модуль должен работать начиная с Win2k
Здравствуйте, _BOBAH_, Вы писали:
_BO>Здравствуйте, Константин Л., Вы писали:
КЛ>>Этот CIxPtr использовал каждый клиент и проблема определения pid была решена. Однако этот метод подходит не ко всем ситуациям. имхо, это проще чем CoRegisterChannelHook. КЛ>>Поэтому и спросил про решаемую задачу.
_BO>К сожалению не подходит для меня . Есть реализвация стандартного интерфейса IDataObject и в некоторых методах нужно определить кто их вызывает. И еще одно требование такое что модуль (dll) осуществляющий данный финт ушами не должен регистрироваться в реестре так как вполне возможна ситуация когда доступ к HKLM будет закрыт (под гостем). Модуль должен работать начиная с Win2k
I>насколько я понял задачу — изначально нужно было получить PID процесса клиента. знание apartmentid ее решить не поможет.
I>чтобы получить PID клиента есть как минимум 2 варианта - I>- channel hooks, CoRegisterChannelHook, http://www.microsoft.com/msj/0198/activex0198.aspx I>- custom marshaling. в своих proxy/stub можно добавлять нужную информацию при маршалинге
I>как правило afaik используется первый вариант, т.к. он более универсальный
Могу предложить ещё третий вариант (со значительно меньшей кровью):
Эта калбек-функция вызывается COM-подсистемой при получении любого вызова из внешних процессов. И в частности в неё передаётся HTASK threadIDCaller (аналог TID).
Здравствуйте, remark, Вы писали:
R>Могу предложить ещё третий вариант (со значительно меньшей кровью):
R>С помощью CoRegisterMessageFilter() регистрируешь интерфейс IMessageFilter. R>У него есть калбек-функция IMessageFilter::HandleInComingCall(): R>
R>Эта калбек-функция вызывается COM-подсистемой при получении любого вызова из внешних процессов. И в частности в неё передаётся HTASK threadIDCaller (аналог TID).
R>Собственно всё.
R>
Здравствуйте, remark, Вы писали:
R>А сервер в exe или в dll?
Сервер может быть любой. На входе у меня есть интерфейс определенный, указатель на который я могу получить как угодно (я низнаю как он был получен) — ясен только один факт что он есть — вызвав определенный метод хочу узнать параметры сервера (сервер находится всегда на той же машине), а именно процесс в котором он находится — сервер не мой и может быть активирован как угодно (внутри процессно в том же аппартаменте или в другом, внепроцессно)
Здравствуйте, _BOBAH_, Вы писали:
_BO>Здравствуйте, remark, Вы писали:
R>>А сервер в exe или в dll?
_BO>Сервер может быть любой. На входе у меня есть интерфейс определенный, указатель на который я могу получить как угодно (я низнаю как он был получен) — ясен только один факт что он есть — вызвав определенный метод хочу узнать параметры сервера (сервер находится всегда на той же машине), а именно процесс в котором он находится — сервер не мой и может быть активирован как угодно (внутри процессно в том же аппартаменте или в другом, внепроцессно)
Про STA ничего не написано, написано только "DLL object applications cannot register a message filter"
Здравствуйте, remark, Вы писали:
R>Здравствуйте, _BOBAH_, Вы писали:
_BO>>Здравствуйте, remark, Вы писали:
R>>>А сервер в exe или в dll?
_BO>>Сервер может быть любой. На входе у меня есть интерфейс определенный, указатель на который я могу получить как угодно (я низнаю как он был получен) — ясен только один факт что он есть — вызвав определенный метод хочу узнать параметры сервера (сервер находится всегда на той же машине), а именно процесс в котором он находится — сервер не мой и может быть активирован как угодно (внутри процессно в том же аппартаменте или в другом, внепроцессно)
R>Про STA ничего не написано, написано только "DLL object applications cannot register a message filter"
Почитай Дональда Бокса, он детально описывает в своей книге Essential COM про механизм маршалинга и в частности STA и IMessageFilter(Глава "Аппартаменты" — "Стандартный маршалинг, потоки и протоколы")
... Фильтры сообщений являются уникальными для STA. Фильтр сообщений — это объект СОМ для каждого STA, который используется для решения вопроса, организовать диспетчеризацию поступающих ORPC-запросов или нет. ...