在另一线程中调用IHTMLElement*的get_innerText方法时出现内存访问冲突

villers 2015-05-18 06:59:59
pEle->get_innerText(&bstr);时出现内存访问冲突的错误
但是用pEle->get_tagName(&bstr);却没有错误.

在主线程中调用pEle->get_innerText(&bstr);都可以

for( INT iCount = 0; iCount < lItem; iCount ++ )
{
V_I4(&varID) = iCount;

CComQIPtr<IDispatch> spDisp;

hr = spElemColl->item(varID, varIdx, &spDisp);

if (SUCCEEDED(hr) && spDisp)
{
CComQIPtr<IHTMLElement> spElem;

hr = spDisp->QueryInterface(IID_IHTMLElement, (void**)&spElem);

if (SUCCEEDED(hr))
{
BSTR bstrId = SysAllocString(L""),bstrtag= SysAllocString(L"");

POINT point;

BSTR bId= SysAllocString(L""),bText= SysAllocString(L""),bHtml= SysAllocString(L""),btagName = SysAllocString(L"");

spElem->get_tagName(&btagName);

CString strTempTagName(btagName);

if (strTempTagName.Compare("!") == 0)
{
continue;
}

point = GetElemPoint(spElem);

spElem->get_id(&bId);

//异常报错,更严重的是会造成内存泄露!
spElem->get_innerText(&bText);
spElem->get_innerHTML(&bHtml);
}
...全文
284 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
redui 2015-05-19
  • 打赏
  • 举报
回复
跨线程跨进程调用COM接口,必须首先列集和散列该接口,否则等同于找死
zgl7903 2015-05-19
  • 打赏
  • 举报
回复
向导生成的MFC应用程序初始化COM是 COINIT_APARTMENTTHREADED 类型的, 因此如果要在线程中使用COM,线程中还得 CoIntializeEx(0, COINIT_APARTMENTTHREADED) 和 CoUninitialize

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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