Переправка событий через компонент
От: lol4ever  
Дата: 16.08.06 15:36
Оценка:
Есть компонент, который работает с асп. Он вывешивает событие при помощи проперти.

HRESULT CClass::Fire_OnNeed(BSTR Id, VARIANT* Body)
{
    CComVariant vId;
    vId.vt = VT_BSTR;
    vId.bstrVal = Id;

//m_vEventHandler - то самое проперти

    if (m_vEventHandler.pdispVal != NULL)
    {
        int DispidValue = DISPID_VALUE;
        HRESULT hrInvoke = ATL::CComDispatchDriver(m_vEventHandler.pdispVal).
            Invoke1(DispidValue, &vId, &vFilename);
        if (FAILED(hrInvoke)) return hrInvoke;
    }
    else return E_FAIL;

    HRESULT hrDetach = vBody.Detach(Body);
    if (FAILED(hrDetach)) return hrDetach;

    return S_OK;
}



Если событие вывешивается им в процессе выполнения какой-либо своей функции — все хорошо. Но этот компонент в свою очередь — надстройка над еще одним, который тоже вывешивает событие, причем в двух вариантах: либо через Connection Point либо через проперти.
Возникла необходимость переправлять событие из основного компонента через надстройку в асп. Напрямую туда запихнуть проперти из надстройки, чтобы основной компонент вызывал аспшную функцию нельзя(надстройка получает через событие контент файла, закодированный в Base64, а основной компонент — имя файла). Логично попробовать подключиться в надстройке к ConnectionPoint, что и сделал. Все замечательно, событие мы получаем, заходим в функцию, которая должна переправить событие в асп:

void CClass::ProcessNeed(BSTR certId, BSTR* certFilename)
{
    HRESULT hr;

    EncodeUtils::IEncodingPtr pEncode; //этот компонент декодирует из B64 в файл
    hr = pEncode.CreateInstance(__uuidof(EncodeUtils::Encoding));
    if(FAILED(hr)) Error(OLESTR("Error creating ActiveX."), GUID_NULL, hr);
    
    CComVariant varBody;
    hr = Fire_OnNeed(Id, &varBody);
    if (FAILED(hr)) Error(OLESTR("Error processing event!"), GUID_NULL, hr);
    
    hr = varBody.ChangeType(VT_BSTR);
    
    CAtlTemporaryFile File;
    hr = File.Create(NULL, GENERIC_WRITE);
    if (FAILED(hr)) Error(OLESTR("Error creating temporary file."), GUID_NULL, hr);
    
    _bstr_t bstFilename = File.TempFileName();
        
    File.HandsOff();
    hr = pEncode ->Base64Decode(varBody.bstrVal, bstFilename); //функция, которая декодирует B64 контент в файл
    certFile.HandsOn();
    if (FAILED(hr)) Error(OLESTR("Error creating temporary file."), GUID_NULL, hr);

    *Filename = bstFilename.Detach();

    return S_OK;
}


Но мы теряем проперти, а следовательно не может ничего позвать в асп...

Вопрос: как реализовать подобный механизм переправки?
Была идея ловить событие через то же проперти, но какой IDispatch* тогда передавать в проперти исходного компонента? Там функция вывешивания события аналогична...
Или можно как-то сохранить живым проперти в надстройке (и тогда проблема решена)?
Re: Переправка событий через компонент
От: lol4ever  
Дата: 17.08.06 07:53
Оценка:
Есть подозрение на то, что создается при событии еще экземпляр класса, но тогда в чем косяк?...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.