Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > загрузка html в WEB компонент


Автор: The Thing 17.3.2008, 18:22
Только разбираюсь с технологий COM.
Просьба, подсказать как загрузить HTML код в браузер "НЕ ИЗ ФАЙЛА".
Я сгенерил код, и хочу его туда передать.

Код из MSDN IHTMLDocument2::write что-то не сработал.
Код

    IHTMLDocument2 *document; // Declared earlier in the code
    HRESULT hresult = S_OK;
    VARIANT *param;
    SAFEARRAY *sfArray;
    BSTR bstr = SysAllocString(OLESTR("Written by IHTMLDocument2::write()."));

    // Creates a new one-dimensional array
    sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1);
    
    if (sfArray == NULL || document == NULL) {
        goto cleanup;
    }

    hresult = SafeArrayAccessData(sfArray,(LPVOID*) & param);
    param->vt = VT_BSTR;
    param->bstrVal = bstr;
    hresult = SafeArrayUnaccessData(sfArray);
    hresult = document->write(sfArray);

cleanup:
    SysFreeString(bstr);
    if (sfArray != NULL) {
        SafeArrayDestroy(sfArray);
    }


Спасибо!

Добавлено через 4 минуты и 36 секунд
Привожу код функции
Код

void CDrebedengiView::OnDownloadComplete()
{
    IHTMLDocument2 *document; // Declared earlier in the code
    IDispatch *pDisp = GetHtmlDocument();
    ASSERT(pDisp);
    pDisp->QueryInterface( __uuidof(IHTMLDocument2), (void**)&document);
    ASSERT( SUCCEEDED(document) );
    pDisp->Release();
    HRESULT hresult = S_OK;
    VARIANT *param;
    SAFEARRAY *sfArray;
    BSTR bstr = SysAllocString(OLESTR("<HTML>Written by IHTMLDocument2::write().</HTML>"));

    // Creates a new one-dimensional array
    sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1);
    
    if (sfArray == NULL || document == NULL) {
        return;
    }

    hresult = SafeArrayAccessData(sfArray,(LPVOID*) & param);
    param->vt = VT_BSTR;
    param->bstrVal = bstr;
    hresult = SafeArrayUnaccessData(sfArray);
    hresult = document->writeln(sfArray);

    SysFreeString(bstr);
    if (sfArray != NULL) {
        SafeArrayDestroy(sfArray);
    }

    CHtmlView::OnDownloadComplete();
}

Автор: The Thing 18.3.2008, 09:52
Я нашел несколько примеров, где загружается именно таким способом...
Но у меня не работает. Окно пустое, и нажав любую клавишу мыши, глухой звук

Автор: The Thing 18.3.2008, 10:12
Код вставлял в эту функцию - не работало!

void CDrebedengiView::OnDownloadComplete()

Вставил в OnInitialUpdate() - заработало :/

Получается что после того как страница загружена ее изменить нельзя?

Автор: The Thing 18.3.2008, 11:43
Ничего не пойму!
А этот код грузит только первый символ
Все дело в строке, почему через SysAllocString все работает 
А через BSTR str = L"Test"; нет?
Код

HRESULT CBasePage::Initial(PID pid)
{
    HRESULT hr;
    CString strHtml = FactoryPage(pid);
    hr = LoadHtml( strHtml );
    return hr;
}

//Загружаем HTML код
HRESULT CBasePage::LoadHtml(LPCTSTR strHtml)
{
    CComPtr<IDispatch> pDocDispatch = GetHtmlDocument();
    CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> pHtmlDocument2(pDocDispatch);

    HRESULT hr;
    SAFEARRAY* psa = SafeArrayCreateVector(VT_VARIANT, 0, 1);

    if( NULL != psa )
    {
        VARIANT *param;
        BSTR bsData = (BSTR)strHtml; //SysAllocString(OLESTR)"Written by IHTMLDocument2::write()."));
        hr =  SafeArrayAccessData(psa, (LPVOID*)&param);

        if( SUCCEEDED( hr ) )
        {
            CComVariant vName("HistroyName");

            hr = pHtmlDocument2->open(L"text/html",vName,CComVariant(),CComVariant(),NULL);

            if( SUCCEEDED(hr) )
            {
                param->vt = VT_BSTR;
                param->bstrVal = (BSTR)bsData;

                hr = pHtmlDocument2->write(psa);

                hr = pHtmlDocument2->close();
            }
        }

        if (psa != NULL) {
            SafeArrayDestroy(psa);
        }
    }

    return hr;
}


Добавлено через 45 секунд
Уже и в динамической памяти строкусоздавал.. передавал - та же фигня

Автор: The Thing 18.3.2008, 12:00
Решил проблему так:
Что делает SysAllocString так и не выяснил. По названию, конечно догадываюсь.. но все даки.

Код

CString strHtml
...
BSTR bsData = SysAllocString( strHtml );
hr = pHtmlDocument2->write(psa);
SysFreeString(bsData);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)