在另一线程中调用IHTMLElement*的get_innerText方法时出现内存访问冲突,该怎么处理
在另一线程中调用IHTMLElement*的get_innerText方法时出现内存访问冲突
pEle->get_innerText(&bstr);时出现内存访问冲突的错误
但是用pEle->get_tagName(&bstr);却没有错误.
在主线程中调用pEle->get_innerText(&bstr);都可以
------解决思路----------------------
向导生成的MFC应用程序初始化COM是 COINIT_APARTMENTTHREADED 类型的,
因此如果要在线程中使用COM,线程中还得 CoIntializeEx(0, COINIT_APARTMENTTHREADED) 和 CoUninitialize
------解决思路----------------------
跨线程跨进程调用COM接口,必须首先列集和散列该接口,否则等同于找死
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);
}
------解决思路----------------------
向导生成的MFC应用程序初始化COM是 COINIT_APARTMENTTHREADED 类型的,
因此如果要在线程中使用COM,线程中还得 CoIntializeEx(0, COINIT_APARTMENTTHREADED) 和 CoUninitialize
------解决思路----------------------
跨线程跨进程调用COM接口,必须首先列集和散列该接口,否则等同于找死