Привет !
Возникла необходимость доступаться к плагину к 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;
};
Здравствуйте, 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>
А кроспостить не хорошо!
Здравствуйте, Алекс, Вы писали:
[skipped]
А>А кроспостить не хорошо!
А оверквотить еще хуже
Здравствуйте, Flamer, Вы писали:
F>Здравствуйте, Алекс, Вы писали:
F>[skipped]
F>
А>>А кроспостить не хорошо!
F>А оверквотить еще хуже
Приношу свои извинения.
Забылся.