Здравствуйте, _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>>