目的: 点一个按钮后,生成一个WebBrowser的对象,并且让他在dialog里显示出来。我找了几种办法,都无法实现。请大家帮忙!!!!对话框上已有一个webbrowser的控件,IDC_EXPLORER1方法1:
CWebBrowser2 * pbrowser = new CWebBrowser2;
pBrowser->Create("",WS_VISIBLE,CRect(0,0,20,20),NULL,IDC_EXPLORER1,0,0,0);
// Create时就出错了,怎么也Create不起来,我怀疑是第4个参数(pParentWnd),我取得了这个dialog的pointer,传进去还是出错。错误是Debug Assertion Failed,file:occcont.cpp,58行。
pBrowser->Navigate...方法2:
   CoInitialize(NULL);   CComPtr<IWebBrowser2> m_spOleObjectPreloadBrowser;
   HRESULT hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC,
IID_IWebBrowser2, (void **)&m_spOleObjectPreloadBrowser); if (FAILED(hr)){
     TRACE(_T("Can not create WebBrowser\r\n"));
    return FALSE;
     }    CComQIPtr<IWebBrowser2,&IID_IWebBrowser2> pWebBrowser(m_spOleObjectPreloadBrowser);
    if(pWebBrowser){
    CComBSTR bstrURL = _T("www.sina.com.cn");
    COleSafeArray vPostData;
    pWebBrowser->Navigate(bstrURL,
    COleVariant((long) 0, VT_I4),
    COleVariant(_T(""), VT_BSTR),
    vPostData,
    COleVariant(_T(""), VT_BSTR)); }这样一直到navigate都不出错可是显示不出东西啊网络也显示没有任何下载,关键就是如何让WebBrowser对象和界面关联起来,显示出来!!!!

解决方案 »

  1.   

    你的方法一就正确啊,我调用以下代码成功:
    CWebBrowser2* pWB2 = new CWebBrowser2;
    pWB2->Create(NULL, WS_CHILD | WS_VISIBLE, CRect(0, 0, 800, 400), this, 99);
      

  2.   

    方法一有问题,
    1.作为一个窗口,窗口的指针必须是全局或者成员变量,否则该窗口指针将在函数体结束时失效
    2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏
      

  3.   

    第二种方法,呵呵,建议写成这样(测试通过的):
    // Error checking omitted for clarity
    CComPtr<IOleObject> spOleObj;// Create WebBrowser--store pointer in class member variable m_spWebBrowser
    CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (void**)&m_spWebBrowser);// Query WebBrowser for IOleObject pointer
    m_spWebBrowser->QueryInterface(IID_IOleObject, (void**)&spOleObj);// Set client site
    spOleObj->SetClientSite(this);// In-place activate the WebBrowser control
    RECT rcClient
    GetClientRect(&rcClient);
    spOleObj->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, this, 0, GetTopLevelWindow(), &rcClient);// Register container to intercept WebBrowser events
    AtlAdvise(m_spWebBrowser, GetUnknown(), DIID_DWebBrowserEvents2, &m_dwCookie);// Navigate to start page
    m_spWebBrowser->Navigate(L"res://webhost.exe/startpage.htm", NULL, NULL, NULL, NULL);
      

  4.   

    1.作为一个窗口,窗口的指针必须是全局或者成员变量,否则该窗口指针将在函数体结束时失效
    >> 这是对的
    2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏
    >> 这是错的