Re[2]: Определение аппртамента
От: Ivan Россия www.rsdn.ru
Дата: 01.12.06 12:16
Оценка: 20 (5)
Здравствуйте, Vi2, Вы писали:

Vi2>Re: Runtime определение апартмента из кода.
Автор: Ivan
Дата: 26.10.02

насколько я понял задачу — изначально нужно было получить PID процесса клиента. знание apartmentid ее решить не поможет.

чтобы получить PID клиента есть как минимум 2 варианта —
— channel hooks, CoRegisterChannelHook, http://www.microsoft.com/msj/0198/activex0198.aspx
— custom marshaling. в своих proxy/stub можно добавлять нужную информацию при маршалинге

как правило afaik используется первый вариант, т.к. он более универсальный
Re[8]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 29.12.06 07:56
Оценка: 8 (1) +1
Здравствуйте, 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-запросов или нет. ...

Vladimir, ICQ# 306404574

Re: Определение аппртамента
От: Vi2 Удмуртия http://www.adem.ru
Дата: 01.12.06 12:00
Оценка: 3 (2)
Здравствуйте, _BOBAH_, Вы писали:

_BO>Как можно решить эту задачу?


Re: Runtime определение апартмента из кода.
Автор: Ivan
Дата: 26.10.02
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Определение аппртамента
От: Константин Л.  
Дата: 01.12.06 13:00
Оценка: 8 (1)
Здравствуйте, _BOBAH_, Вы писали:

[]

_BO> Сабж был четко обдуман прежде чем я его запостил, а дизайн построен четко в соответствии с требованиями, ничего лишнего все кратко правильно и лаконично ... но чтобы заработало так как требуется нужно решить поставленную задачу


говоря "кривой дизайн" я имел ввиду способ получения PID.

Похожую проблему мы решали. Надо было знать о клиентах внепроцессного COM сервера.

К нужному интерфейсу было добавлено пару методов:


HRESULT AddRefApp( ULONG pid, BSTR appName );
HRESULT ReleaseApp( ULONG pid );


и был написан враппер над ATL::CComPtr:


class CIxPtr: public CComPtr<Ix>
{
    typedef public CComPtr<Ix> Base;    

public:

    CIxPtr(DWORD PID, LPCTSTR lpszAppName = NULL )
        : m_PID(PID),
            m_bsAppName( lpszAppName? lpszAppName : _T("") )
    {}

    ~CIxPtr()
    {
        if (*this != NULL)
            (*this)->ReleaseApp(m_PID);
    }

    HRESULT CoCreateInstance()
    {        
        HRESULT hr = CComPtr<Ix>::CoCreateInstance(CLSID_Ix, NULL, CLSCTX_LOCAL_SERVER);
        if (FAILED(hr))
            return hr;
        (*this)->AddRefApp(m_PID, m_bsAppName);        
        return S_OK;
    }
    
protected:

    DWORD    m_PID;
    _bstr_t    m_bsAppName;
};


Этот CIxPtr использовал каждый клиент и проблема определения pid была решена. Однако этот метод подходит не ко всем ситуациям. имхо, это проще чем CoRegisterChannelHook.
Поэтому и спросил про решаемую задачу.

_BO> Ничего личного
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Определение аппртамента
От: remark Россия http://www.1024cores.net/
Дата: 26.12.06 22:53
Оценка: 8 (1)
Здравствуйте, Ivan, Вы писали:

I>Здравствуйте, Vi2, Вы писали:


Vi2>>Re: Runtime определение апартмента из кода.
Автор: Ivan
Дата: 26.10.02

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 используется первый вариант, т.к. он более универсальный


Могу предложить ещё третий вариант (со значительно меньшей кровью):

С помощью CoRegisterMessageFilter() регистрируешь интерфейс IMessageFilter.
У него есть калбек-функция IMessageFilter::HandleInComingCall():

DWORD HandleInComingCall(
DWORD dwCallType,
HTASK threadIDCaller,
DWORD dwTickCount,
LPINTERFACEINFO lpInterfaceInfo );


Эта калбек-функция вызывается COM-подсистемой при получении любого вызова из внешних процессов. И в частности в неё передаётся HTASK threadIDCaller (аналог TID).

Собственно всё.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 01.12.06 11:38
Оценка: -1
Здравствуйте, Константин Л., Вы писали:

КЛ>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.


Мне не надо в TLS лезть потому что во первых он ничего мне не даст во вторых тот который мне нужен находится в другом потоке и возможно даже в другом процессе

_BO>>Как можно решить эту задачу?


КЛ>Зачем тебе это? Че-то похоже на кривость дизайна


Если не знаешь как ответить зачем флейм разводить?? Мое дело зачем!! Раз спрашиваю, значит это действительно мне нужно, и это я решил не просто так потому-что "похоже на кривость дизайна", а потому что действительно мне так нужно!! Честно говоря начинает бесить .. периодически такие "умники" выскакивают ... хочется поговорить то это не сюда
_BOBAH_, ICQ# 306404574
Muzik:Apocalyptica — Be
Re[2]: Определение аппртамента
От: AlikGut  
Дата: 01.12.06 11:46
Оценка: -1
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, _BOBAH_, Вы писали:


скипано.

КЛ>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.


_BO>>Как можно решить эту задачу?


КЛ>Зачем тебе это? Че-то похоже на кривость дизайна


всё дело в том, мой юный друг, что на свете бывают задачи, о существовании которых, ты, к сожалению, даже не подозреваешь.
Определение аппртамента
От: _BOBAH_ Россия  
Дата: 01.12.06 11:19
Оценка:
Привет всем знатокам СOM'а !

Возникла следующая нетривиальная задача (для меня нетривиальная).
Есть некий объект который реализует интерфейс IDataObject. При вызове его метода нужно определить кто вызвал объект, а имнно PID процесса в котором сидит proxy вызвавший метод объекта.
Как я вижу решение этой проблемы:

Как можно решить эту задачу?
_BOBAH_, ICQ# 306404574
Muzik:Apocalyptica — Be
Re: Определение аппртамента
От: Константин Л.  
Дата: 01.12.06 11:26
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO>Привет всем знатокам СOM'а !


_BO>Возникла следующая нетривиальная задача (для меня нетривиальная).

_BO>Есть некий объект который реализует интерфейс IDataObject. При вызове его метода нужно определить кто вызвал объект, а имнно PID процесса в котором сидит proxy вызвавший метод объекта.
_BO>Как я вижу решение этой проблемы:
_BO>
апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.

_BO>Как можно решить эту задачу?


Зачем тебе это? Че-то похоже на кривость дизайна
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Определение аппртамента
От: Константин Л.  
Дата: 01.12.06 12:23
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO>Здравствуйте, Константин Л., Вы писали:


КЛ>>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.


_BO>Мне не надо в TLS лезть потому что во первых он ничего мне не даст во вторых тот который мне нужен находится в другом потоке и возможно даже в другом процессе


а я тебе говорю, что эту информацию ты сможешь получить только из того потока, apartment которого тебе нужно узнать.

Вот еще ссылочка здесь
Автор(ы): Alexey Shirshov
Дата: 28.10.2004
можно в коде MTS/COM+-компонента найти, в каком апартменте он создан, причем для STA – в каком именно STA – host, main или ином, и как-то идентифицировать апартмент


_BO>>>Как можно решить эту задачу?


КЛ>>Зачем тебе это? Че-то похоже на кривость дизайна


_BO>Если не знаешь как ответить зачем флейм разводить?? Мое дело зачем!! Раз спрашиваю, значит это действительно мне нужно, и это я решил не просто так потому-что "похоже на кривость дизайна", а потому что действительно мне так нужно!! Честно говоря начинает бесить .. периодически такие "умники" выскакивают ... хочется поговорить то это не сюда


Вам помочь пытаюсь, вам. Может быть есть другой способ добиться желаемого результата. Всего-лишь прошу объяснить надобность. Может по-другому проблему решить можно. Кроме того, именно ты спрашиваешь, поэтому если хочешь получить ответ, будь любезнее... хамить то зачем?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 01.12.06 12:26
Оценка:
Здравствуйте, Ivan, Вы писали:

I>Здравствуйте, Vi2, Вы писали:


Vi2>>Re: Runtime определение апартмента из кода.
Автор: Ivan
Дата: 26.10.02

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 используется первый вариант, т.к. он более универсальный


Спасибо ОГРОМНОЕ!
_BOBAH_, ICQ# 306404574
Muzik:Apocalyptica — Ma
off
От: Константин Л.  
Дата: 01.12.06 12:27
Оценка:
Здравствуйте, AlikGut, Вы писали:

AG>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, _BOBAH_, Вы писали:


AG>скипано.


КЛ>>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.


_BO>>>Как можно решить эту задачу?


КЛ>>Зачем тебе это? Че-то похоже на кривость дизайна


AG> всё дело в том, мой юный друг, что на свете бывают задачи, о существовании которых, ты, к сожалению, даже не подозреваешь.


спасибо, о мой учитель, что просвятили, а я то и не знал
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 01.12.06 12:46
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, _BOBAH_, Вы писали:


_BO>>Здравствуйте, Константин Л., Вы писали:


КЛ>>>апартмент — всего-лишь запись в TLS (или где там я уже не помню). Сделать ты этого не сможешь.


_BO>>Мне не надо в TLS лезть потому что во первых он ничего мне не даст во вторых тот который мне нужен находится в другом потоке и возможно даже в другом процессе


КЛ>а я тебе говорю, что эту информацию ты сможешь получить только из того потока, apartment которого тебе нужно узнать.


КЛ>Вот еще ссылочка здесь
Автор(ы): Alexey Shirshov
Дата: 28.10.2004
можно в коде MTS/COM+-компонента найти, в каком апартменте он создан, причем для STA – в каком именно STA – host, main или ином, и как-то идентифицировать апартмент


Ссылку видел уже, спасибо! Но не подходит она мне — тем более недокументированный способ .

_BO>>>>Как можно решить эту задачу?


КЛ>>>Зачем тебе это? Че-то похоже на кривость дизайна


_BO>>Если не знаешь как ответить зачем флейм разводить?? Мое дело зачем!! Раз спрашиваю, значит это действительно мне нужно, и это я решил не просто так потому-что "похоже на кривость дизайна", а потому что действительно мне так нужно!! Честно говоря начинает бесить .. периодически такие "умники" выскакивают ... хочется поговорить то это не сюда


КЛ>Вам помочь пытаюсь, вам. Может быть есть другой способ добиться желаемого результата. Всего-лишь прошу объяснить надобность. Может по-другому проблему решить можно. Кроме того, именно ты спрашиваешь, поэтому если хочешь получить ответ, будь любезнее... хамить то зачем?


Хамство тут не было .. накипело — когда вместо ответа тебе приходит вроде того что "кривой дизайн" или что-то вроде того. Если бы был вопрос по дизайну то это звучало бы примерно так
Вот мой код я наколбасил его. Оцените пожалуйста его правильность (кривизну) и тому подобное...

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

Ничего личного
_BOBAH_, ICQ# 306404574
Muzik:Apocalyptica — Ha
Re[6]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 01.12.06 14:27
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Этот CIxPtr использовал каждый клиент и проблема определения pid была решена. Однако этот метод подходит не ко всем ситуациям. имхо, это проще чем CoRegisterChannelHook.

КЛ>Поэтому и спросил про решаемую задачу.

К сожалению не подходит для меня . Есть реализвация стандартного интерфейса IDataObject и в некоторых методах нужно определить кто их вызывает. И еще одно требование такое что модуль (dll) осуществляющий данный финт ушами не должен регистрироваться в реестре так как вполне возможна ситуация когда доступ к HKLM будет закрыт (под гостем). Модуль должен работать начиная с Win2k
_BOBAH_, ICQ# 306404574
Muzik:Apocalyptica — Co
Re[7]: Определение аппртамента
От: Константин Л.  
Дата: 01.12.06 16:32
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO>Здравствуйте, Константин Л., Вы писали:


КЛ>>Этот CIxPtr использовал каждый клиент и проблема определения pid была решена. Однако этот метод подходит не ко всем ситуациям. имхо, это проще чем CoRegisterChannelHook.

КЛ>>Поэтому и спросил про решаемую задачу.

_BO>К сожалению не подходит для меня . Есть реализвация стандартного интерфейса IDataObject и в некоторых методах нужно определить кто их вызывает. И еще одно требование такое что модуль (dll) осуществляющий данный финт ушами не должен регистрироваться в реестре так как вполне возможна ситуация когда доступ к HKLM будет закрыт (под гостем). Модуль должен работать начиная с Win2k


теперь понятна моя мотивация?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Определение аппртамента
От: Tom Россия http://www.RSDN.ru
Дата: 08.12.06 12:22
Оценка:
_BO> Спасибо ОГРОМНОЕ!

Можно ещё контексты использовать с их policy, а ещё проще — отмаршалить указатель и прочитать из стрима PID, код для этого есть в форуме исходники.
Народная мудрось
всем все никому ничего(с).
Re[4]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 27.12.06 11:56
Оценка:
Здравствуйте, remark, Вы писали:

R>Могу предложить ещё третий вариант (со значительно меньшей кровью):


R>С помощью CoRegisterMessageFilter() регистрируешь интерфейс IMessageFilter.

R>У него есть калбек-функция IMessageFilter::HandleInComingCall():
R>

R>DWORD HandleInComingCall(
R> DWORD dwCallType,
R> HTASK threadIDCaller,
R> DWORD dwTickCount,
R> LPINTERFACEINFO lpInterfaceInfo );


R>Эта калбек-функция вызывается COM-подсистемой при получении любого вызова из внешних процессов. И в частности в неё передаётся HTASK threadIDCaller (аналог TID).


R>Собственно всё.


R>


Это работает только в STA аппартаменте.

Vladimir, ICQ# 306404574

Re[5]: Определение аппртамента
От: remark Россия http://www.1024cores.net/
Дата: 27.12.06 16:14
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO>Это работает только в STA аппартаменте.


А сервер в exe или в dll?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 28.12.06 06:52
Оценка:
Здравствуйте, remark, Вы писали:

R>А сервер в exe или в dll?


Сервер может быть любой. На входе у меня есть интерфейс определенный, указатель на который я могу получить как угодно (я низнаю как он был получен) — ясен только один факт что он есть — вызвав определенный метод хочу узнать параметры сервера (сервер находится всегда на той же машине), а именно процесс в котором он находится — сервер не мой и может быть активирован как угодно (внутри процессно в том же аппартаменте или в другом, внепроцессно)

Vladimir, ICQ# 306404574

Re[7]: Определение аппртамента
От: remark Россия http://www.1024cores.net/
Дата: 28.12.06 09:42
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO>Здравствуйте, remark, Вы писали:


R>>А сервер в exe или в dll?


_BO>Сервер может быть любой. На входе у меня есть интерфейс определенный, указатель на который я могу получить как угодно (я низнаю как он был получен) — ясен только один факт что он есть — вызвав определенный метод хочу узнать параметры сервера (сервер находится всегда на той же машине), а именно процесс в котором он находится — сервер не мой и может быть активирован как угодно (внутри процессно в том же аппартаменте или в другом, внепроцессно)


Про STA ничего не написано, написано только "DLL object applications cannot register a message filter"


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: Определение аппртамента
От: remark Россия http://www.1024cores.net/
Дата: 06.01.07 12:33
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO> Почитай Дональда Бокса, он детально описывает в своей книге Essential COM про механизм маршалинга и в частности STA и IMessageFilter(Глава "Аппартаменты" — "Стандартный маршалинг, потоки и протоколы")


Я вот подумал, что всё-таки документация The Open Group у меня вызывает больше доверия, чем книжка Дональда Бокса.
Поэтому скорее всего для exe серверов это должно работать во всех типах апартментов.
Ты проверял, что это работает только в sta?
Мне, честно говоря, лень проверять


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 09.01.07 11:39
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, _BOBAH_, Вы писали:


_BO>> Почитай Дональда Бокса, он детально описывает в своей книге Essential COM про механизм маршалинга и в частности STA и IMessageFilter(Глава "Аппартаменты" — "Стандартный маршалинг, потоки и протоколы")


R>Я вот подумал, что всё-таки документация The Open Group у меня вызывает больше доверия, чем книжка Дональда Бокса.

R>Поэтому скорее всего для exe серверов это должно работать во всех типах апартментов.
R>Ты проверял, что это работает только в sta?
R>Мне, честно говоря, лень проверять

Да мне тоже лень (да и времени нету) если честно да и свою задачу я уже давно решил другим способом.

R>

Vladimir, ICQ# 306404574

Re[11]: Определение аппртамента
От: AndrewJD США  
Дата: 09.01.07 16:23
Оценка:
Здравствуйте, _BOBAH_, Вы писали:


_BO>да и свою задачу я уже давно решил другим способом.

Расскажешь каким?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[12]: Определение аппртамента
От: _BOBAH_ Россия  
Дата: 10.01.07 06:35
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Здравствуйте, _BOBAH_, Вы писали:



_BO>>да и свою задачу я уже давно решил другим способом.

AJD>Расскажешь каким?

Да простым — забил на эти апартаменты и переделал кардинально другим способом который никак не связан с темой данной ветки — решение явно завязанное на задачу и поверь неинтересно

Vladimir, ICQ# 306404574

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.