100分求分析DocumentComplete崩溃错误

xharry 2007-06-18 12:31:30
我的一个CWebBrowser2控件
在DocumentComplete中,把html的内容动态的追加‘hello,world’在后面
但偶尔会程序崩溃,提示mshtml.dll出错。下面是代码,请熟悉com的朋友
帮我看看,哪里有指针或者资源方面的错误。

谢谢。


void CMyDemo::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
{
if (pDisp == NULL) return;
if (URL->bstrVal == NULL) return;

CString strUrl = (CString)(*URL);
if (strUrl.Find(_T("http:")) < 0) return;


try
{
HRESULT hr;

// get IWebBrowser2
IWebBrowser2 * pWebBrowser = NULL;
hr = pDisp->QueryInterface(IID_IWebBrowser2,
(void **)&pWebBrowser);
if (FAILED(hr)) return;
if (pWebBrowser == NULL) return;

// get document
CComPtr<IDispatch> spDispDoc;
hr = pWebBrowser->get_Document(&spDispDoc);
if (FAILED(hr)) return;
if (spDispDoc == NULL) return;

CComPtr<IHTMLDocument2> spHTMLDoc;
hr = spDispDoc->QueryInterface(IID_IHTMLDocument2,(void**)&spHTMLDoc);
if (FAILED(hr)) return;
if (spHTMLDoc == NULL) return;

IHTMLDocument2* document = NULL;
document = spHTMLDoc;

CComPtr<IHTMLElement> body;
IHTMLElement *parent;

// get the body object
hr = document->get_body(&body);
if (FAILED(hr)) return;

// 通过body,取得html
hr = body->get_parentElement(&parent);
if (FAILED(hr)) return;
if (parent == NULL) return;

// get html
BSTR bstr;
CString str;
hr = parent->get_outerHTML(&bstr);
if (FAILED(hr)) return;
// body->get_outerHTML(&bstr);
str = bstr;

SAFEARRAY *safe_array = SafeArrayCreateVector(VT_VARIANT, 0, 1);
if (safe_array == NULL) return;

VARIANT *variant = NULL;
hr = SafeArrayAccessData(safe_array,(LPVOID *)&variant);
if (FAILED(hr))
return;
variant->vt = VT_BSTR;

// 追加 hello,world
str += _T("hello, world");
variant->bstrVal = CString(str).AllocSysString();

// write SAFEARRAY to browser document
document->write(safe_array);
document->close();

SafeArrayUnaccessData(safe_array);

// release
parent->Release();
pWebBrowser->Release();


}catch(...)
{
// NOOP
}

}
...全文
257 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xharry 2007-06-21
  • 打赏
  • 举报
回复
最后UP一次
eduyu 2007-06-19
  • 打赏
  • 举报
回复
这样操作太费劲,容易出错。
用IHTMLWindow2::execScript 快速,安全。
xharry 2007-06-19
  • 打赏
  • 举报
回复
顶一下
xharry 2007-06-18
  • 打赏
  • 举报
回复
我已经按JiangSheng所说,将漏掉的那个也加上了,再测测

难道大家使用CWebBrowser2控件,就没有遇到过mshtml.dll错误??

abomber2 2007-06-18
  • 打赏
  • 举报
回复
是的 智能指针 不能用->Release()

直接用.Release()

否则会Release两次
xharry 2007-06-18
  • 打赏
  • 举报
回复
少了个document->Release();
不Release可能导致程序Crash?

CComPtr<IDispatch> spDispDoc; CComPtr是智能指针,这里应该不需要Release();


------------

添加网页元素问题:我只想在原来的网页代码的最后追加一段html代码,insertBefore是加在前面,我用document.write是不是也没有错误?好像document.write会保证javascript的执行,我追加的是JavaScript

蒋晟 2007-06-18
  • 打赏
  • 举报
回复
return之前要Release所有获得的COM接口指针
添加网页元素用IHTMLDocument2::createElement和IHTMLDOMNode::insertBefore /IHTMLDOMNode::appendChild
redpetallsg 2007-06-18
  • 打赏
  • 举报
回复
不懂,帮你顶一下。

16,472

社区成员

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

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

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