解决多线程中spInputElement.GetPropertyByName( L"name", &vName )导致崩溃

来源:互联网 发布:淘宝的网络经营模式 编辑:程序博客网 时间:2024/05/17 07:32

原因是COM的对象都生活在套间里,拥有线程相关性。就是你的gui主线程如果要共享一个COM接口,比如说是IHTMLDocument2*,不可以直接就把指针copy或者共享给子线程,需要向系统一个服务注册一个cookie,DWORD格式,然后子线程询问系统把这个cookie还原成接口指针。


IHTMLDocument2* pHtmlDocument2 =(IHTMLDocument2*)(m_web.get_Document());if(!pHtmlDocument2){return;}CComGITPtr<IHTMLDocument2> pgit(pHtmlDocument2);m_dwCookie=pgit.Detach();//开启一个线程进行循环操作AfxBeginThread((AFX_THREADPROC)StartRegBeginThread, this);   //如果都采用默认值


线程函数中处理

UINT CBaiduReg20Dlg::StartRegBeginThread(DWORD pParam){CBaiduReg20Dlg* pThis = (CBaiduReg20Dlg*)pParam;OleInitialize(NULL);CComGITPtr<IHTMLDocument2> pHtmlDocument2GITP(pThis->m_dwCookie);CComPtr<IHTMLDocument2> pHTMLDocument2;if(FAILED(pHtmlDocument2GITP.CopyTo(&pHTMLDocument2))){AtlTrace(_T("Failed in GIT to PTR"));CoUninitialize();return 0;}pHtmlDocument2GITP.Revoke();//执行代码pThis->StartRegBegin(pHTMLDocument2);CoUninitialize();return 0;}


线程中调用处理后将不会在崩溃了。
CComVariant vName, vType,vVal; // 名称,类型 ,值
hr = spInputElement.GetPropertyByName( L"name", &vName );
if( FAILED( hr ) )
{
continue;
}


0 0
原创粉丝点击