Есть компонент, который работает с асп. Он вывешивает событие при помощи проперти.
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* тогда передавать в проперти исходного компонента?

Там функция вывешивания события аналогична...
Или можно как-то сохранить живым проперти в надстройке (и тогда проблема решена)?