目的: 点一个按钮后,生成一个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对象和界面关联起来,显示出来!!!!
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对象和界面关联起来,显示出来!!!!
CWebBrowser2* pWB2 = new CWebBrowser2;
pWB2->Create(NULL, WS_CHILD | WS_VISIBLE, CRect(0, 0, 800, 400), this, 99);
1.作为一个窗口,窗口的指针必须是全局或者成员变量,否则该窗口指针将在函数体结束时失效
2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏
// 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);
>> 这是对的
2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏
>> 这是错的