Re: Возможно ли такое?
От: Tom Россия http://www.RSDN.ru
Дата: 07.04.04 16:12
Оценка: 6 (1)
Новая версия с определением и ID процесса
Автор: Tom
Дата: 07.04.04
Народная мудрось
всем все никому ничего(с).
Возможно ли такое?
От: Denwer Россия  
Дата: 06.04.04 11:47
Оценка:
Есть приложение которое через интерфейс другого приложения получает IDispatch, и вызывает у него метод. Но вот проблема в том, что бы узнать какому процессу пренадлежит этот диспатч, что бы если он пренадлежит этому же процессу то вызывать не нужно(такое может быть), а то получиться рекурсия.

Еще раз другой терминологией:
Программа А запрашивает у программы В интерфейс, но возможен случай когда программа В вернет интерфейс тойже самой копии программы А, это надо как то отследить, т.е. понять какому процессу принадлежит вернувшийся интерфейс.

Какие решения есть:
1) Для предотвращения рекурсии использовать IMessageFilter
2) Реализовать медо GetPID

Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?
Re: Возможно ли такое?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.04.04 12:13
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?

Можно воспользоваться тем фактом, что отмаршаленный указатель на объект в тот же апартамент будет чистым указателем, т.е. без прокси/стаб. Какой-то интерфейс нужно запросить, навскидку, я не помню какой.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Возможно ли такое?
От: Denwer Россия  
Дата: 06.04.04 12:15
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Denwer, Вы писали:


Vi2>

D>>Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?

Vi2>Можно воспользоваться тем фактом, что отмаршаленный указатель на объект в тот же апартамент будет чистым указателем, т.е. без прокси/стаб. Какой-то интерфейс нужно запросить, навскидку, я не помню какой.

IUnknown, пока так и сделал. Просто у меня может быть много таких интерфейсов, и мне приходиться сравнивать пришедший со всеми имеющими.
Re[2]: Возможно ли такое?
От: Дмитрий Бл-й Россия  
Дата: 07.04.04 10:03
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Denwer, Вы писали:


Vi2>

D>>Может есть еще какие идеи еще? Может можно как то узнать из какого процесса пришол вызов?

Vi2>Можно воспользоваться тем фактом, что отмаршаленный указатель на объект в тот же апартамент будет чистым указателем, т.е. без прокси/стаб. Какой-то интерфейс нужно запросить, навскидку, я не помню какой.
Proxy возвращает IClientSecurity.
Но он может влететь в тот же процесс, но в другой апартамент. Здесь, вероятно, поможет FTM, но тогда придётся о-о-чень аккуратно программировать на предмет межпотоковой безопасности.
Re: Возможно ли такое?
От: Tom Россия http://www.RSDN.ru
Дата: 07.04.04 11:49
Оценка:
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;
}
Народная мудрось
всем все никому ничего(с).
Re[2]: Возможно ли такое?
От: Denwer Россия  
Дата: 08.04.04 05:57
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Новая версия с определением и ID процесса
Автор: Tom
Дата: 07.04.04


То что надо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.