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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.