100送上求如何动态生成IWebBrowser
目的: 点一个按钮后,生成一个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对象和界面关联起来,显示出来!!!!
问题点数:100、回复次数:9Top
1 楼nystroM(nys)回复于 2005-01-19 11:39:17 得分 0
顶一下Top
2 楼nystroM(nys)回复于 2005-01-19 12:10:34 得分 0
大家帮忙啊Top
3 楼qrlvls( 空 气 )回复于 2005-01-19 12:50:46 得分 10
CreateControl
Top
4 楼dandycheung(珠穆朗玛)回复于 2005-01-19 22:31:18 得分 10
你的方法一就正确啊,我调用以下代码成功:
CWebBrowser2* pWB2 = new CWebBrowser2;
pWB2->Create(NULL, WS_CHILD | WS_VISIBLE, CRect(0, 0, 800, 400), this, 99);
Top
5 楼fanqing(火影忍者+28%(准备学习进程/线程))回复于 2005-01-20 09:54:19 得分 0
学习
Top
6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-01-20 10:09:47 得分 10
注意create了,需要释放Top
7 楼modena(非云)回复于 2005-01-20 10:38:22 得分 20
方法一有问题,
1.作为一个窗口,窗口的指针必须是全局或者成员变量,否则该窗口指针将在函数体结束时失效
2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏Top
8 楼modena(非云)回复于 2005-01-20 10:44:26 得分 30
第二种方法,呵呵,建议写成这样(测试通过的):
// 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);
Top
9 楼dandycheung(珠穆朗玛)回复于 2005-01-20 11:29:34 得分 20
1.作为一个窗口,窗口的指针必须是全局或者成员变量,否则该窗口指针将在函数体结束时失效
>> 这是对的
2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏
>> 这是错的Top




