100送上求如何动态生成IWebBrowser

nystroM 2005-01-19 11:37:36
目的: 点一个按钮后,生成一个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对象和界面关联起来,显示出来!!!!
...全文
330 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dandycheung 2005-01-20
  • 打赏
  • 举报
回复
1.作为一个窗口,窗口的指针必须是全局或者成员变量,否则该窗口指针将在函数体结束时失效
>> 这是对的
2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏
>> 这是错的
modena 2005-01-20
  • 打赏
  • 举报
回复
第二种方法,呵呵,建议写成这样(测试通过的):
// 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);

modena 2005-01-20
  • 打赏
  • 举报
回复
方法一有问题,
1.作为一个窗口,窗口的指针必须是全局或者成员变量,否则该窗口指针将在函数体结束时失效
2.你的Dialog上已经有一个控件,那么就已经有一个控件窗口,你调用Create时,将在使用相同的控件ID去创建一个新的窗口,如果MFC让你成功,那么原来控件对应的窗口将形成失效的指针而造成内存泄漏
oyljerry 2005-01-20
  • 打赏
  • 举报
回复
注意create了,需要释放
fanqing 2005-01-20
  • 打赏
  • 举报
回复
学习
qrlvls 2005-01-19
  • 打赏
  • 举报
回复
CreateControl
nystroM 2005-01-19
  • 打赏
  • 举报
回复
大家帮忙啊
nystroM 2005-01-19
  • 打赏
  • 举报
回复
顶一下
dandycheung 2005-01-19
  • 打赏
  • 举报
回复
你的方法一就正确啊,我调用以下代码成功:
CWebBrowser2* pWB2 = new CWebBrowser2;
pWB2->Create(NULL, WS_CHILD | WS_VISIBLE, CRect(0, 0, 800, 400), this, 99);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧