IE自动填表的操作,总是报错!
使用的MFC添加webbrowser控件,还添加了dhtml,加入了不少包装类,从网上找了一堆代码,东拼西凑的,又是包装类,又是智能指针,
下面的代码是在工作线程中,运行的前三次都可以正常输入账号密码,确定,但是到了第四次的时候,再输入账号就会报错,在下面有注释,对这些原理都不是很懂,大概猜测是不是资源没有释放,尝试在pIDisp->Release(),放入几个语句后面,结果也是错误百出,请教一下,下面的代码,存在什么隐患,如何来解决,或者如何优化下代码??
报错的提示是:unhandled exception in **.exe :0xC00000005 :Accees violation,点击确定后,跳转到的页面 namespace ATL ,代码
ATLINLINE ATLAPI_(IUnknown*) AtlComPtrAssign(IUnknown** pp, IUnknown* lp)
{
if (lp != NULL)
lp->AddRef(); //指向这一行
if (*pp)
(*pp)->Release();
*pp = lp;
return lp;
}
- C/C++ code
CComPtr<IWebBrowser2> spBrowser;CoGetInterfaceAndReleaseStream(pDlg->m_pStream,IID_IWebBrowser2,(LPVOID*)&spBrowser); // 散列获得浏览器代理接LPDISPATCH pIDisp;CHTMLElement htmle;CHTMLDocument2 htmlDoc; CHTMLFormElement htmlfe;CHTMLElementCollection htmlec;_variant_t vName;_variant_t vIndex;CComDispatchDriver spInputElement;while(readFile.ReadString(account)){ ......省略若干不相关操作 spBrowser->get_Document(&pIDisp); htmlDoc=pIDisp; htmlec=htmlDoc.GetForms(); //获得表单集合 vIndex=(long)0; htmlfe=htmlec.item(vName,vIndex); pIDisp=htmlfe.item(CComVariant(2), CComVariant()); //这里第四次就会出错 取得第2项表单域 账号 spInputElement=pIDisp; vSetStatus=account; spInputElement.PutPropertyByName(L"value", &vSetStatus); pIDisp=htmlfe.item(CComVariant(3), CComVariant()); //取得第3项表单域 密码 spInputElement=pIDisp; vSetStatus=password; spInputElement.PutPropertyByName(L"value", &vSetStatus); htmle=htmlfe.item(CComVariant(4), CComVariant()); //确定啦 pDlg->m_bDocComplete=FALSE; htmle.click(); ......省略若干操作}[解决办法]
查看下面的“ 从 VC7 的 CHtmlView 不能正常退出谈 CComPtr 使用中的一个误区”
http://blog.csdn.net/jonfei/archive/2007/10/25/1843284.aspx
我看了下,跟你这里写的错误代码是一样的,这里提到了如何修改
[解决办法]
你可以创建一个线程,在这个线程中进行sendmess,这样就不会影响程序的响应了。我也曾经遇到过类似的问题,单独在形成中执行会初相各种异常,例如访问冲突,CComQIptr释放不成功,如果我采用sendmessage的方法,发送消息到主线程后处理,问题自然就没了,其中缘由我也不解。