S
serzh44
Собственно вот код:
[codebox]void CEventView::SetHtml(OLECHAR *id,char *str){
IHTMLDocument2*htmlDoc2;
LPDISPATCH lpDispatch;
VARIANT*pVar;
BSTR bstr;
lpDispatch=this->GetHtmlDocument();
lpDispatch->QueryInterface(IID_IHTMLDocument2,(void**)&htmlDoc2);
IHTMLElementCollection *elc;
IHTMLElement *el;
htmlDoc2->get_all(&elc);
VARIANT v1,v2;
v1.vt=VT_BSTR;
v1.bstrVal=SysAllocString(id);
v2.vt=VT_INT;
v2.intVal=0;
LPDISPATCH lpDisp;
elc->item(v1,v2,&lpDisp);
lpDisp->QueryInterface(IID_IHTMLElement,(void**)&el);
long size=MultiByteToWideChar(1251,0,str,-1,NULL,0);
WCHAR *str1=(wchar_t*)GlobalAlloc(GMEM_FIXED,sizeof(wchar_t)*size);
MultiByteToWideChar(1251,0,str,-1,str1,size);
el->put_innerHTML(str1); //ВЫЛЕТАЕТ ЗДЕСЬ
GlobalFree(str1);
el->Release();
lpDisp->Release();
htmlDoc2->Release();
lpDispatch->Release();
}[/codebox]
Эта процедура изменяет HTML код тега, id которого передаётся, как параметр.
Процедура прекрасно работает при выполнении из других методов класса CEventView (например, при обработке нажатия на ссылку). Но из потока происходит ошибка доступа. Поток выполняет данный метод по ссылке на объект класса CEventView. Теоритически я могу предположить из-за чего это происходит, видимо нужна синхронизация потоков. Но каких и как? Я совершенно не знаю как это делать. Уже много литературы прочитал по синхронизации.....но всё, что я видел относится обычно к двум или более потокам, которые явно определены как функции и разделяют доступ к переменным или объектам ядра, а у меня один поток определён, а второй - обработчики MFC....и ресурс у меня COM объект.....вот и не знаю, что делать......А может проблема не из-за синхронизации?
[codebox]void CEventView::SetHtml(OLECHAR *id,char *str){
IHTMLDocument2*htmlDoc2;
LPDISPATCH lpDispatch;
VARIANT*pVar;
BSTR bstr;
lpDispatch=this->GetHtmlDocument();
lpDispatch->QueryInterface(IID_IHTMLDocument2,(void**)&htmlDoc2);
IHTMLElementCollection *elc;
IHTMLElement *el;
htmlDoc2->get_all(&elc);
VARIANT v1,v2;
v1.vt=VT_BSTR;
v1.bstrVal=SysAllocString(id);
v2.vt=VT_INT;
v2.intVal=0;
LPDISPATCH lpDisp;
elc->item(v1,v2,&lpDisp);
lpDisp->QueryInterface(IID_IHTMLElement,(void**)&el);
long size=MultiByteToWideChar(1251,0,str,-1,NULL,0);
WCHAR *str1=(wchar_t*)GlobalAlloc(GMEM_FIXED,sizeof(wchar_t)*size);
MultiByteToWideChar(1251,0,str,-1,str1,size);
el->put_innerHTML(str1); //ВЫЛЕТАЕТ ЗДЕСЬ
GlobalFree(str1);
el->Release();
lpDisp->Release();
htmlDoc2->Release();
lpDispatch->Release();
}[/codebox]
Эта процедура изменяет HTML код тега, id которого передаётся, как параметр.
Процедура прекрасно работает при выполнении из других методов класса CEventView (например, при обработке нажатия на ссылку). Но из потока происходит ошибка доступа. Поток выполняет данный метод по ссылке на объект класса CEventView. Теоритически я могу предположить из-за чего это происходит, видимо нужна синхронизация потоков. Но каких и как? Я совершенно не знаю как это делать. Уже много литературы прочитал по синхронизации.....но всё, что я видел относится обычно к двум или более потокам, которые явно определены как функции и разделяют доступ к переменным или объектам ядра, а у меня один поток определён, а второй - обработчики MFC....и ресурс у меня COM объект.....вот и не знаю, что делать......А может проблема не из-за синхронизации?