Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [winapi]WebBrowser 
V
    Опции темы
GoldFinch
Дата 22.12.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



пытаюсь использовать компонент WebBrowser, не используя MFC, ATL
Код

#include <windows.h>
#include <exdisp.h>

class OleInPlaceSite : public IOleInPlaceSite
{
public:
    /****************** IUnknown ***************************************************/
    HRESULT __stdcall QueryInterface( REFIID riid,    void** ppvObject )
    {
        if( !ppvObject )
            return E_POINTER;
        if( riid==IID_IUnknown || riid==IID_IOleWindow || riid==IID_IOleInPlaceSite )
            return *ppvObject = (void*)this, S_OK;
        *ppvObject = NULL;
        return E_NOINTERFACE;
    }
    ULONG __stdcall AddRef() { return 1; /*one instance*/ }
    ULONG __stdcall Release() { return 1; /*one instance*/ }
    /********************* IOleWindow ***********************************************/
    HRESULT __stdcall GetWindow( HWND *phwnd ) { return phwnd?(*phwnd = this->hwnd, S_OK):E_INVALIDARG; }
    HRESULT __stdcall ContextSensitiveHelp( BOOL ) { return S_OK; }
    /********************* IOleInPlaceSite ******************************************/
    HRESULT __stdcall CanInPlaceActivate() { return S_OK; }
    HRESULT __stdcall OnInPlaceActivate() { return S_OK; }
    HRESULT __stdcall OnUIActivate() { return S_OK; }
    HRESULT __stdcall GetWindowContext( IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc,
        LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
    {
        if( !(ppFrame && ppDoc && lprcPosRect && lprcClipRect && lpFrameInfo) )
            return E_INVALIDARG;

        *ppFrame = NULL;
        *ppDoc = NULL;

        GetClientRect( this->hwnd, lprcPosRect );
        GetClientRect( this->hwnd, lprcClipRect );

        lpFrameInfo->fMDIApp = false;
        lpFrameInfo->hwndFrame = this->hwnd;
        lpFrameInfo->haccel = 0;
        lpFrameInfo->cAccelEntries = 0;

        return S_OK;
    }
    HRESULT __stdcall Scroll( SIZE ) { return S_OK; }
    HRESULT __stdcall OnUIDeactivate( BOOL ) { return S_OK; }
    HRESULT __stdcall OnInPlaceDeactivate() { return S_OK; }
    HRESULT __stdcall DiscardUndoState() { return S_OK; }
    HRESULT __stdcall DeactivateAndUndo() { return S_OK; }
    HRESULT __stdcall OnPosRectChange( LPCRECT ) { return S_OK; }

public:
    HWND hwnd;
};

class OleClientSite : public IOleClientSite
{
public:
    /****************** IUnknown ***************************************************/
    HRESULT __stdcall QueryInterface( REFIID riid,    void** ppvObject)
    {
        if( !ppvObject )
            return E_POINTER;
        if( riid==IID_IUnknown || riid==IID_IOleClientSite )
            return *ppvObject = (void*)this, S_OK;
        if( riid==IID_IOleInPlaceSite )
            return *ppvObject = (void*)&oleInPlaceSite, S_OK;
        *ppvObject = NULL;
        return E_NOINTERFACE;
    }
    ULONG __stdcall AddRef() { return 1; /*one instance*/ }
    ULONG __stdcall Release() { return 1; /*one instance*/ }
    /*************************************** IOleClientSite ***************************************/
    HRESULT __stdcall SaveObject() { return S_OK; }
    HRESULT __stdcall GetMoniker( DWORD, DWORD, IMoniker **ppmk ) { return *ppmk = NULL, E_NOTIMPL; }
    HRESULT __stdcall GetContainer( IOleContainer** ppContainer ) { return *ppContainer=NULL, E_NOINTERFACE; }
    HRESULT __stdcall ShowObject() { return S_OK; }
    HRESULT __stdcall OnShowWindow( BOOL ) { return S_OK; }
    HRESULT __stdcall RequestNewObjectLayout() { return E_NOTIMPL; }

public:
    OleInPlaceSite oleInPlaceSite;    
};

bool EmbedBrowser(HWND hwnd)
{
    OleClientSite* wndData = new OleClientSite;
    wndData->oleInPlaceSite.hwnd = hwnd;

    SetWindowLong(hwnd,GWL_USERDATA,(LONG)wndData);

    HRESULT r;

    IWebBrowser2* webBrowser;
    r=CoCreateInstance( CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (void**)&webBrowser );

    IOleObject* oleObject;    
    r=webBrowser->QueryInterface( IID_IOleObject, (void**)&oleObject );

    r=OleSetContainedObject( webBrowser, true );

    r=oleObject->SetClientSite( wndData );

    RECT rect;
    GetClientRect( hwnd, &rect );
    r=oleObject->DoVerb( OLEIVERB_INPLACEACTIVATE, NULL, wndData, 0, hwnd, &rect );

    oleObject->Release();

    BSTR url = SysAllocString( L"ya.ru" );
    VARIANT empty;
    VariantInit(&empty);
    r=webBrowser->Navigate( url, &empty,&empty,&empty,&empty );
    SysFreeString( url );    

    webBrowser->Release();

    return true;
}

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if( uMsg==WM_INITDIALOG )
    {
        return EmbedBrowser(hwndDlg);
    }
    else if( uMsg==WM_CLOSE )
    {
        return EndDialog(hwndDlg,0);
    }
    return false;
}

int __stdcall WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    //CoInitializeEx( 0, 0/*COINIT_MULTITHREADED*/ ); 
    // вместо CoInitializeEx надо OleInitialize чтобы работала OleSetContainedObject
    OleInitialize(0);

    struct DialogTemplate
    {
        DLGTEMPLATE tmpl;
        WORD stuff[3];
    } dialogTemplate = {0};
    dialogTemplate.tmpl.style = WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME;
    dialogTemplate.tmpl.x = 100;
    dialogTemplate.tmpl.y = 100;
    dialogTemplate.tmpl.cx = 300;
    dialogTemplate.tmpl.cy = 200;
    DialogBoxIndirectParamA( 0,(LPCDLGTEMPLATE)&dialogTemplate.tmpl, 0, &DialogProc, 0);

    CoUninitialize();
}

почему-то WebBrowser не встраивается в окно, а создается как отдельное окно

проверка ошибок вырезана для упрощения кода,
при отладке все функции в EmbedBrowser возвращают S_OK

Это сообщение отредактировал(а) GoldFinch - 24.12.2009, 10:02
PM MAIL ICQ   Вверх
GoldFinch
Дата 23.12.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



может у кого-нить хоть пример какой есть, с рабочим кодом?

я пока что нашел только 
http://www.kakeeware.com/i_kb.php
но оно на масме, а я масм ставить не хочу, а на фасм переписать не получается, тоже что и на С++ выходит  =\
алсо там куча ошибок в коде, но оно как-то работает =\

еще есть
http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4379/
и
http://www.mvps.org/user32/
но там используется OleCreate и от кода требуется больше интерфейсов
PM MAIL ICQ   Вверх
GoldFinch
Дата 23.12.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ох щи....
вместо CoInitializeEx() надо было OleInitialize()
PM MAIL ICQ   Вверх
GoldFinch
Дата 25.12.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



более правильный, рабочий пример в аттаче.
версия на фасме: http://wasm.ru/forum/viewtopic.php?id=35838


Присоединённый файл ( Кол-во скачиваний: 57 )
Присоединённый файл  main.cpp 4,75 Kb
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0405 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.