ROT Helper
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.11.02 15:48
Оценка: 2 (1)
Привет !

Возникла необходимость доступаться к плагину к MSIE из другой прожки.
Удобство ROT — наиболее простой IPC. MSIE выступает в виде суррогатного процесса и не надо беспокоится и маршаллинге и тд (ну, почти не надо).

Вот написал классик, который это упрощает.

Может пригодится кому ?

template <class T,const CLSID* pclsid>
class ATL_NO_VTABLE    CROTHelper  
{
public:
    CROTHelper()
    {
        m_dwROTID = 0;
    }
    virtual ~CROTHelper()
    {

    }

    HRESULT ConnectToROT()
    {    
        USES_CONVERSION;

        HRESULT hr = S_OK;

        CComPtr<IRunningObjectTable> pTable;
        hr = GetRunningObjectTable(0, &pTable);
        if( SUCCEEDED(hr) )
        {
            CComPtr<IMoniker> pMoniker;
            LPOLESTR olestrName;

            StringFromCLSID(*pclsid,&olestrName);
            
            if(CreateItemMoniker(L"!", olestrName, &pMoniker) == S_OK)
            {
                DWORD dwRegister; 

                hr = pTable->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, static_cast<T*>(this)->GetUnknown(), pMoniker, &dwRegister);

                if( SUCCEEDED(hr) )
                {
                    m_dwROTID = dwRegister;
                    ATLTRACE(_T("Connect to ROT : the moniker %s has been registered successfully\n"), OLE2T(olestrName));
                }
                else
                {
                    ATLTRACE(_T("Connect to ROT : failed to register moniker % s in the ROT\n"), OLE2T(olestrName));
                }
            }
            else
            {
                ATLTRACE(_T("Connect to ROT : failed to create moniker %s\n"), OLE2T(olestrName));
            }
        }
        else
        {
            ATLTRACE(_T("Connect to ROT : could not retrieve the ROT pointer\n"));
        }

        return hr;        
    }

    HRESULT DisconnectFromROT()
    {
        HRESULT hr;
        CComPtr<IRunningObjectTable> pTable;

        hr = GetRunningObjectTable(0, &pTable);
        if( SUCCEEDED(hr) )
        {
            hr = pTable->Revoke(m_dwROTID);
            ATLTRACE(_T("Disconnect from ROT : ID = %d, result code %x\n"), m_dwROTID, hr);
        }
        m_dwROTID = 0;

        return hr;
    }

    HRESULT FindSame(IUnknown **ppUnk)
    {
        USES_CONVERSION;

        HRESULT hr = S_OK;

        CComPtr<IRunningObjectTable> pTable;
        hr = GetRunningObjectTable(0, &pTable);
        if( SUCCEEDED(hr) )
        {
            CComPtr<IMoniker> pMoniker;
            LPOLESTR olestrName;

            StringFromCLSID(*pclsid,&olestrName);
            
            hr = CreateItemMoniker(L"!", olestrName, &pMoniker);

            if( SUCCEEDED(hr) )
            {

                hr = pTable->GetObject(pMoniker,ppUnk);
                if(FAILED(hr))
                {
                    ATLTRACE(_T("Connect to ROT : failed to obtain object %s\n"),OLE2T(olestrName));
                }

            }
            else
            {
                ATLTRACE(_T("Connect to ROT : failed to create moniker %s\n"), OLE2T(olestrName));
            }
        }
        else
        {
            ATLTRACE(_T("Connect to ROT : could not retrieve the ROT pointer\n"));
        }

        return hr;        

    }

    static HRESULT FindItem(REFIID iid,IUnknown **ppUnk)
    {
        HRESULT hr = S_OK;

        if(ppUnk == NULL)
            return E_POINTER;

        CComPtr<IRunningObjectTable> pTable;
        
        hr = GetRunningObjectTable(0, &pTable);
        if(SUCCEEDED(hr))
        {
            CComPtr<IEnumMoniker> pEnum;

            hr = pTable->EnumRunning(&pEnum);
            if(SUCCEEDED(hr))
            {
                CComPtr<IUnknown> pUnknown;
                CComPtr<IMoniker> pCurMoniker;
                while (pEnum->Next(1, &pCurMoniker, NULL) == S_OK) 
                {
                    if(SUCCEEDED(pTable->GetObject(pCurMoniker, &pUnknown)))
                    {
                        if(SUCCEEDED(pUnknown->QueryInterface(iid,ppUnk)))
                            return S_OK;
                    }
                    pCurMoniker.Release();
                }
            }
        }
        return S_FALSE;
    }

    DWORD m_dwROTID;
};
Re: ROT Helper
От: Алекс Россия http://wise-orm.com
Дата: 20.11.02 07:15
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

OE>Привет !


OE>Возникла необходимость доступаться к плагину к MSIE из другой прожки.

OE>Удобство ROT — наиболее простой IPC. MSIE выступает в виде суррогатного процесса и не надо беспокоится и маршаллинге и тд (ну, почти не надо).

OE>Вот написал классик, который это упрощает.


OE>Может пригодится кому ?


OE>
OE>template <class T,const CLSID* pclsid>
OE>class ATL_NO_VTABLE    CROTHelper  
OE>{
OE>public:
OE>    CROTHelper()
OE>    {
OE>        m_dwROTID = 0;
OE>    }
OE>    virtual ~CROTHelper()
OE>    {

OE>    }

OE>    HRESULT ConnectToROT()
OE>    {    
OE>        USES_CONVERSION;

OE>        HRESULT hr = S_OK;

OE>        CComPtr<IRunningObjectTable> pTable;
OE>        hr = GetRunningObjectTable(0, &pTable);
OE>        if( SUCCEEDED(hr) )
OE>        {
OE>            CComPtr<IMoniker> pMoniker;
OE>            LPOLESTR olestrName;

OE>            StringFromCLSID(*pclsid,&olestrName);
OE>            
OE>            if(CreateItemMoniker(L"!", olestrName, &pMoniker) == S_OK)
OE>            {
OE>                DWORD dwRegister; 

OE>                hr = pTable->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, static_cast<T*>(this)->GetUnknown(), pMoniker, &dwRegister);

OE>                if( SUCCEEDED(hr) )
OE>                {
OE>                    m_dwROTID = dwRegister;
OE>                    ATLTRACE(_T("Connect to ROT : the moniker %s has been registered successfully\n"), OLE2T(olestrName));
OE>                }
OE>                else
OE>                {
OE>                    ATLTRACE(_T("Connect to ROT : failed to register moniker % s in the ROT\n"), OLE2T(olestrName));
OE>                }
OE>            }
OE>            else
OE>            {
OE>                ATLTRACE(_T("Connect to ROT : failed to create moniker %s\n"), OLE2T(olestrName));
OE>            }
OE>        }
OE>        else
OE>        {
OE>            ATLTRACE(_T("Connect to ROT : could not retrieve the ROT pointer\n"));
OE>        }

OE>        return hr;        
OE>    }

OE>    HRESULT DisconnectFromROT()
OE>    {
OE>        HRESULT hr;
OE>        CComPtr<IRunningObjectTable> pTable;

OE>        hr = GetRunningObjectTable(0, &pTable);
OE>        if( SUCCEEDED(hr) )
OE>        {
OE>            hr = pTable->Revoke(m_dwROTID);
OE>            ATLTRACE(_T("Disconnect from ROT : ID = %d, result code %x\n"), m_dwROTID, hr);
OE>        }
OE>        m_dwROTID = 0;

OE>        return hr;
OE>    }

OE>    HRESULT FindSame(IUnknown **ppUnk)
OE>    {
OE>        USES_CONVERSION;

OE>        HRESULT hr = S_OK;

OE>        CComPtr<IRunningObjectTable> pTable;
OE>        hr = GetRunningObjectTable(0, &pTable);
OE>        if( SUCCEEDED(hr) )
OE>        {
OE>            CComPtr<IMoniker> pMoniker;
OE>            LPOLESTR olestrName;

OE>            StringFromCLSID(*pclsid,&olestrName);
OE>            
OE>            hr = CreateItemMoniker(L"!", olestrName, &pMoniker);

OE>            if( SUCCEEDED(hr) )
OE>            {

OE>                hr = pTable->GetObject(pMoniker,ppUnk);
OE>                if(FAILED(hr))
OE>                {
OE>                    ATLTRACE(_T("Connect to ROT : failed to obtain object %s\n"),OLE2T(olestrName));
OE>                }

OE>            }
OE>            else
OE>            {
OE>                ATLTRACE(_T("Connect to ROT : failed to create moniker %s\n"), OLE2T(olestrName));
OE>            }
OE>        }
OE>        else
OE>        {
OE>            ATLTRACE(_T("Connect to ROT : could not retrieve the ROT pointer\n"));
OE>        }

OE>        return hr;        

OE>    }

OE>    static HRESULT FindItem(REFIID iid,IUnknown **ppUnk)
OE>    {
OE>        HRESULT hr = S_OK;

OE>        if(ppUnk == NULL)
OE>            return E_POINTER;

OE>        CComPtr<IRunningObjectTable> pTable;
OE>        
OE>        hr = GetRunningObjectTable(0, &pTable);
OE>        if(SUCCEEDED(hr))
OE>        {
OE>            CComPtr<IEnumMoniker> pEnum;

OE>            hr = pTable->EnumRunning(&pEnum);
OE>            if(SUCCEEDED(hr))
OE>            {
OE>                CComPtr<IUnknown> pUnknown;
OE>                CComPtr<IMoniker> pCurMoniker;
OE>                while (pEnum->Next(1, &pCurMoniker, NULL) == S_OK) 
OE>                {
OE>                    if(SUCCEEDED(pTable->GetObject(pCurMoniker, &pUnknown)))
OE>                    {
OE>                        if(SUCCEEDED(pUnknown->QueryInterface(iid,ppUnk)))
OE>                            return S_OK;
OE>                    }
OE>                    pCurMoniker.Release();
OE>                }
OE>            }
OE>        }
OE>        return S_FALSE;
OE>    }

OE>    DWORD m_dwROTID;
OE>};
OE>


А кроспостить не хорошо!
Re[2]: ROT Helper
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 20.11.02 07:32
Оценка:
Здравствуйте, Алекс, Вы писали:

[skipped]


А>А кроспостить не хорошо!


А оверквотить еще хуже
Re[3]: ROT Helper
От: Алекс Россия http://wise-orm.com
Дата: 20.11.02 07:46
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Здравствуйте, Алекс, Вы писали:


F>[skipped]


F>

А>>А кроспостить не хорошо!

F>А оверквотить еще хуже


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