проблемы с IMoniker::BindToStorage
От: Jeka_B  
Дата: 13.01.12 15:26
Оценка:
Здравствуйте

Пытаюсь сделать свой Flash ActiveX контейнер. Загружаю SWF файл в котором есть относительные пути к некоторым ресурсам. Доступ к ресурсам хочу реализовать через моникеры. Добрался уже к ним. Реализовал свой класс моникера и теперь вызывается функция BindToStorage в которой я указываю указатель на свой класс IStream (можно назвать его MyStream). Но после этого ничего больше не происходит !!! Что еще нужно сделать чтоб началась загрузка контента через мой клас MyStream. (Я установил у всех функциях Trace но там так ни разу ни одна функция и не вызвалсь, обращения к MyStream не было)
Что я делаю не так? Что нужно еще сделать?
Re: проблемы с IMoniker::BindToStorage
От: AndrewJD США  
Дата: 13.01.12 18:12
Оценка:
Здравствуйте, Jeka_B, Вы писали:

J_B>Пытаюсь сделать свой Flash ActiveX контейнер. Загружаю SWF файл в котором есть относительные пути к некоторым ресурсам. Доступ к ресурсам хочу реализовать через моникеры. Добрался уже к ним. Реализовал свой класс моникера и теперь вызывается функция BindToStorage в которой я указываю указатель на свой класс IStream (можно назвать его MyStream). Но после этого ничего больше не происходит !!! Что еще нужно сделать чтоб началась загрузка контента через мой клас MyStream. (Я установил у всех функциях Trace но там так ни разу ни одна функция и не вызвалсь, обращения к MyStream не было)

J_B>Что я делаю не так? Что нужно еще сделать?

Не совсем понятно, что ты пытаешься сделать. Если ты хочешь загружать SWF из флеша используя моникеры, то это твоя обязанность загрузить данные и вернуть IStream
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[2]: проблемы с IMoniker::BindToStorage
От: Jeka_B  
Дата: 15.01.12 09:43
Оценка:
Здравствуйте, AndrewJD, Вы писали:

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


J_B>>Пытаюсь сделать свой Flash ActiveX контейнер. Загружаю SWF файл в котором есть относительные пути к некоторым ресурсам. Доступ к ресурсам хочу реализовать через моникеры. Добрался уже к ним. Реализовал свой класс моникера и теперь вызывается функция BindToStorage в которой я указываю указатель на свой класс IStream (можно назвать его MyStream). Но после этого ничего больше не происходит !!! Что еще нужно сделать чтоб началась загрузка контента через мой клас MyStream. (Я установил у всех функциях Trace но там так ни разу ни одна функция и не вызвалсь, обращения к MyStream не было)

J_B>>Что я делаю не так? Что нужно еще сделать?

AJD>Не совсем понятно, что ты пытаешься сделать. Если ты хочешь загружать SWF из флеша используя моникеры, то это твоя обязанность загрузить данные и вернуть IStream


Постараюсь обьяснить более детально

Я в свой Flash ActiveX контейнер уже загрузил SWF файл. В этом файле есть некоторые ресурсы которые он использует, там прописаны относительные ссылки вроде images/image1.xxx или properties.prop (ну и тому подобные)
Через интерфейс IBindHost а точнее через функцию этого интерфейса CreateMoniker я возвращаю ему свой клас порожденный от IMoniker


HRESULT STDMETHODCALLTYPE IBindHost::CreateMoniker(
        IN LPOLESTR szName,
        IN IBindCtx *pBC,
        OUT IMoniker **ppmk,
        IN DWORD dwReserved))
{
    CMyMoniker *pMoniker = new CMyMoniker(szName);
    if (pMoniker != NULL)
    {
        *ppmk = pMoniker;
        return S_OK;
    }
    else
    {
        return E_OUTOFMEMORY;
    }
}



далее в моем класе созданого ранее мокинера вызывается функция BindToStorage:


HRESULT STDMETHODCALLTYPE CMyMoniker::BindToStorage(
         IN IBindCtx *pbc,
         IN IMoniker *pmkToLeft,
         IN REFIID riid,
         OUT void **ppvObj)
{
    if (riid == IID_IStream)
    {
        //моникер создается в конструкторе класа
        if (m_pMonikerStream != NULL)
        {
            m_pMonikerStream->AddRef();
            *ppvObj = m_pMonikerStream;
        }
        else
        {
            return E_OUTOFMEMORY;
        }
    }

    return MK_E_NOSTORAGE;
}



Проблема в том что никакие функции моего класса m_pMonikerStream (порожденного от IStream) не вызываются (проверено трейсами). Рисунок (если моникер Images/Image1.xxx) не загружается
Что еще нужно сделать, чтоб все заработало? Что я еще забыл?
Re[3]: проблемы с IMoniker::BindToStorage
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.01.12 06:04
Оценка:
Здравствуйте, Jeka_B, Вы писали:

J_B>HRESULT STDMETHODCALLTYPE IBindHost::CreateMoniker(IN LPOLESTR szName, IN IBindCtx *pBC, OUT IMoniker **ppmk, IN DWORD dwReserved)
J_B>{
J_B>    CMyMoniker *pMoniker = new CMyMoniker(szName);
J_B>    if (pMoniker != NULL)
J_B>    {
J_B>        *ppmk = pMoniker;
J_B>        return S_OK;
J_B>    }
J_B>...

Ты уверен, что счётчик ссылок у объекта pMoniker равен 1?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: проблемы с IMoniker::BindToStorage
От: Аноним  
Дата: 16.01.12 07:42
Оценка:
Здравствуйте, Vi2, Вы писали:

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


Vi2>
J_B>>HRESULT STDMETHODCALLTYPE IBindHost::CreateMoniker(IN LPOLESTR szName, IN IBindCtx *pBC, OUT IMoniker **ppmk, IN DWORD dwReserved)
J_B>>{
J_B>>    CMyMoniker *pMoniker = new CMyMoniker(szName);
J_B>>    if (pMoniker != NULL)
J_B>>    {
J_B>>        *ppmk = pMoniker;
J_B>>        return S_OK;
J_B>>    }
J_B>>...
Vi2>

Vi2>Ты уверен, что счётчик ссылок у объекта pMoniker равен 1?

Упс забыл написать, что я вызываю функцию AddRef() для моникера. Да, щетчик моникера равен 1
Re[3]: проблемы с IMoniker::BindToStorage
От: AndrewJD США  
Дата: 16.01.12 10:39
Оценка: 7 (1)
Здравствуйте, Jeka_B, Вы писали:

J_B>Что еще нужно сделать, чтоб все заработало? Что я еще забыл?


Скорее всего IBindStatusCallback.
Не знаю как сейчас, но раньше флеш требовал чтобы callback вызывались.
Т.е. в BindToStorage
нужно вызвать что-то типа такого:


HRESULT CCacheMoniker::DoLoad(IN    PDATALOADST pDS)
{
    LARGE_INTEGER nPos;
    ULARGE_INTEGER nNewPos;
    nPos.QuadPart = nNewPos.QuadPart = 0;
    _S(pDS->pStream->Seek(nPos, STREAM_SEEK_END, &nNewPos));

    DWORD dwSize = (DWORD) nNewPos.QuadPart;
    CBindingImplObj * pBinder;
    _S(CBindingImplObj::CreateInstance(&pBinder));
    
    CComPtr<IBinding> pIBinding;
    _S(pBinder->QueryInterface(__uuidof(IBinding), (void **) &pIBinding));
    _S(pDS->pOuterCallback->OnStartBinding(0, pIBinding));
    
    _S(pDS->pOuterCallback->OnProgress(dwSize, dwSize, 
        BINDSTATUS_ENDDOWNLOADDATA, A2W("data fully loaded")));
    
    nPos.QuadPart = 0;
    pDS->pStream->Seek(nPos, STREAM_SEEK_SET, &nNewPos);
    
    STGMEDIUM stgmed;    
    stgmed.pstm = pDS->pStream;
    stgmed.tymed = TYMED_ISTREAM;
    stgmed.pUnkForRelease = NULL;
    _S(pDS->pOuterCallback->OnDataAvailable(
        BSCF_LASTDATANOTIFICATION | BSCF_FIRSTDATANOTIFICATION, 
        dwSize, CF_NULL, &stgmed));

    nPos.QuadPart = 0;
    pDS->pStream->Seek(nPos, STREAM_SEEK_SET, &nNewPos);

    _S(pDS->pOuterCallback->OnStopBinding(S_OK, NULL));
        
    return S_OK;
}

pDS->pOuterCallback - это IBindStatusCallback*
pDS->pStream - это данные
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[4]: проблемы с IMoniker::BindToStorage
От: Jeka_B  
Дата: 23.01.12 08:37
Оценка:
Здравствуйте, AndrewJD, Вы писали:

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


J_B>>Что еще нужно сделать, чтоб все заработало? Что я еще забыл?


AJD>Скорее всего IBindStatusCallback.

AJD>Не знаю как сейчас, но раньше флеш требовал чтобы callback вызывались.
AJD>Т.е. в BindToStorage
AJD>нужно вызвать что-то типа такого:


AJD>
AJD>HRESULT CCacheMoniker::DoLoad(IN    PDATALOADST pDS)
AJD>{
AJD>    LARGE_INTEGER nPos;
AJD>    ULARGE_INTEGER nNewPos;
AJD>    nPos.QuadPart = nNewPos.QuadPart = 0;
AJD>    _S(pDS->pStream->Seek(nPos, STREAM_SEEK_END, &nNewPos));

AJD>    DWORD dwSize = (DWORD) nNewPos.QuadPart;
AJD>    CBindingImplObj * pBinder;
AJD>    _S(CBindingImplObj::CreateInstance(&pBinder));
    
AJD>    CComPtr<IBinding> pIBinding;
AJD>    _S(pBinder->QueryInterface(__uuidof(IBinding), (void **) &pIBinding));
AJD>    _S(pDS->pOuterCallback->OnStartBinding(0, pIBinding));
    
AJD>    _S(pDS->pOuterCallback->OnProgress(dwSize, dwSize, 
AJD>        BINDSTATUS_ENDDOWNLOADDATA, A2W("data fully loaded")));
    
AJD>    nPos.QuadPart = 0;
    pDS->>pStream->Seek(nPos, STREAM_SEEK_SET, &nNewPos);
    
AJD>    STGMEDIUM stgmed;    
AJD>    stgmed.pstm = pDS->pStream;
AJD>    stgmed.tymed = TYMED_ISTREAM;
AJD>    stgmed.pUnkForRelease = NULL;
AJD>    _S(pDS->pOuterCallback->OnDataAvailable(
AJD>        BSCF_LASTDATANOTIFICATION | BSCF_FIRSTDATANOTIFICATION, 
AJD>        dwSize, CF_NULL, &stgmed));

AJD>    nPos.QuadPart = 0;
    pDS->>pStream->Seek(nPos, STREAM_SEEK_SET, &nNewPos);

AJD>    _S(pDS->pOuterCallback->OnStopBinding(S_OK, NULL));
        
AJD>    return S_OK;
AJD>}

pDS->>pOuterCallback - это IBindStatusCallback*
pDS->>pStream - это данные
AJD>


Огромное спасибо за помощь
Сделал как Вы сказали, все получилось Чтение из стрима производится при вызове OnDataAvailable.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.