IWebBrowser2调用get_Script引起程序崩溃

傻嘚小青年 2016-11-03 09:57:59
目前在C++项目中,需要调用JS界面的方法(轮询调用)。在线程中调用get_Script时,引起程序崩溃。
应该如何解决?代码如下
if ( NULL == m_pWebBrowser )
return false;
CComPtr<IDispatch> pDoc;
HRESULT hr = m_pWebBrowser->get_Document(&pDoc);
if ( FAILED(hr) )
return false;
CComQIPtr<IHTMLDocument2> pDoc2 = pDoc;
if ( NULL == pDoc2 )
return false;
CComQIPtr<IDispatch> pScript;
hr = pDoc2->get_Script(&pScript); pScript = 0x00000000 如果在按钮点击中调用就不会出现该问题。
if ( FAILED(hr) )
return false;
DISPID id = NULL;
CComBSTR bstrFun(lpJsFun.c_str());
hr = pScript->GetIDsOfNames(IID_NULL, &bstrFun, 1, LOCALE_SYSTEM_DEFAULT, &id);
if ( FAILED(hr) )
return false;
DISPPARAMS dispParams;
memset(&dispParams, 0, sizeof(DISPPARAMS));
int nParamCount = params.size();
if ( nParamCount > 0 )
{
dispParams.cArgs = nParamCount;
dispParams.rgvarg = new VARIANT[nParamCount];
for (int i=0; i<nParamCount; ++i )
{
const wstring& str = params[nParamCount-1-i];
CComBSTR bstr(str.c_str());
bstr.CopyTo(&dispParams.rgvarg[i].bstrVal);
dispParams.rgvarg[i].vt = VT_BSTR;
}
}
EXCEPINFO execInfo;
memset(&execInfo, 0, sizeof(EXCEPINFO));
VARIANT vResult;
UINT uArgError = (UINT)-1;
hr = pScript->Invoke(id, IID_NULL, 0, DISPATCH_METHOD, &dispParams, &vResult, &execInfo, &uArgError);
delete[] dispParams.rgvarg;
if ( FAILED(hr) )
return false;
return true;
...全文
214 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yofoo 2016-11-06
  • 打赏
  • 举报
回复
注意WebBrowser等组件的线程模型 get_Script 需要在主线程调用, 其他线程可以发送消息到主线程去使用
赵4老师 2016-11-04
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
encoderlee 版主 2016-11-04
  • 打赏
  • 举报
回复
不管三七二十,不停的轮询调用这段代码。一旦HTML页面发生刷新、跳转动作,必定出现空指针而崩溃

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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