Есть приложение которое через интерфейс другого приложения получает IDispatch, и вызывает у него метод. Но вот проблема в том, что бы узнать какому процессу пренадлежит этот диспатч, что бы если он пренадлежит этому же процессу то вызывать не нужно(такое может быть), а то получиться рекурсия.
Еще раз другой терминологией:
Программа А запрашивает у программы В интерфейс, но возможен случай когда программа В вернет интерфейс тойже самой копии программы А, это надо как то отследить, т.е. понять какому процессу принадлежит вернувшийся интерфейс.
Какие решения есть:
1) Для предотвращения рекурсии использовать IMessageFilter
2) Реализовать медо GetPID
Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?
Здравствуйте, Denwer, Вы писали:
D>Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?
Можно воспользоваться тем фактом, что отмаршаленный указатель на объект в тот же апартамент будет чистым указателем, т.е. без прокси/стаб. Какой-то интерфейс нужно запросить, навскидку, я не помню какой.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Denwer, Вы писали:
Vi2>D>>Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?
Vi2>Можно воспользоваться тем фактом, что отмаршаленный указатель на объект в тот же апартамент будет чистым указателем, т.е. без прокси/стаб. Какой-то интерфейс нужно запросить, навскидку, я не помню какой.
IUnknown, пока так и сделал. Просто у меня может быть много таких интерфейсов, и мне приходиться сравнивать пришедший со всеми имеющими.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Denwer, Вы писали:
Vi2>D>>Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?
Vi2>Можно воспользоваться тем фактом, что отмаршаленный указатель на объект в тот же апартамент будет чистым указателем, т.е. без прокси/стаб. Какой-то интерфейс нужно запросить, навскидку, я не помню какой.
Proxy возвращает IClientSecurity.
Но он может влететь в тот же процесс, но в другой апартамент. Здесь, вероятно, поможет FTM, но тогда придётся о-о-чень аккуратно программировать на предмет межпотоковой безопасности.
D>Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?
Попробуй так:
#include "stdafx.h"
#import "msxml3.dll" named_guids raw_interfaces_only
HRESULT GetPtrIdentity(IUnknown* pUnk, BSTR* pUser, BSTR* pHost)
{
if (pUnk == 0)
return E_POINTER;
//
// CoGetMarshalSizeMax sould be used here but I'm really lazy ;)
//
HRESULT hr;
CComPtr<IStream> pStream;
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, 65535);
if (FAILED(hr = CreateStreamOnHGlobal(
hMem,
TRUE,
&pStream)))
return hr;
if (FAILED(hr = CoMarshalInterface(
pStream,
MSXML2::IID_IXMLDOMDocument2,
pUnk,
MSHCTX_DIFFERENTMACHINE,
0,
MSHLFLAGS_NORMAL)))
return hr;
//
// Read the characrers count
//
LARGE_INTEGER Pos;
Pos.QuadPart = 0x42;
if (FAILED(hr = pStream->Seek(Pos, STREAM_SEEK_SET, 0)))
return hr;
WORD charsCount = 0;
if (FAILED(hr = pStream->Read(&charsCount, sizeof(charsCount), 0)))
return hr;
if (charsCount == 0)
return E_UNEXPECTED;
//
// Read the characters
//
Pos.QuadPart = 0x46;
if (FAILED(hr = pStream->Seek(Pos, STREAM_SEEK_SET, 0)))
return hr;
int buffSize = charsCount * sizeof(wchar_t);
wchar_t* hostInfo = new wchar_t[buffSize];
if (FAILED(hr = pStream->Read(hostInfo, buffSize, 0)))
return hr;
CComBSTR(hostInfo).CopyTo(pUser);
CComBSTR(hostInfo + wcslen(hostInfo) + 2).CopyTo(pHost);
//
// Free memory and release marshal data
//
delete [] hostInfo;
Pos.QuadPart = 0;
if (FAILED(hr = pStream->Seek(Pos, STREAM_SEEK_SET, 0)))
return hr;
if (FAILED(hr = CoReleaseMarshalData(pStream)))
return hr;
return S_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(0);
{
//
// Create some object to marshal it.
// Here can be e.g object you've got by DCOM object.
//
CComPtr<MSXML2::IXMLDOMDocument2> pDoc;
HRESULT hr;
hr = pDoc.CoCreateInstance(MSXML2::CLSID_DOMDocument30);
CComBSTR User;
CComBSTR Host;
GetPtrIdentity(pDoc, &User, &Host);
}
CoUninitialize();
return 0;
}