Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2015, 14:42   #1
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию 0xC0000005: Нарушение прав доступа при чтении "0x00000088"

Есть код:
Код:
IHTMLElement* pElem=NULL;
if(pDoc3->get_documentElement(&pElem)==S_OK)
{
	TRACE("1write=TRUE\n");
	BSTR s;
	if(pElem->get_innerHTML(&s)==S_OK)
	{
		TRACE("2write=TRUE\n");
		std::string s1=_com_util::ConvertBSTRToString(s);
					
		std::ofstream ofs("data.html",std::ofstream::out);
		ofs <<s1.c_str()<<"\n";
		TRACE("3write=TRUE\n");
	}
и эта функция вызывает исключение
if(pElem->get_innerHTML(&s)==S_OK)
Необработанное исключение в "0x5d12a956" в "test_webbrowser222.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000088".

И что я не так делаю???? Как это исправить?
ninja2 вне форума Ответить с цитированием
Старый 17.08.2015, 16:35   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Похоже, что get_documentElement возвращает пустой pElem.
Судя по всему, страница еще не загрузилась.
waleri вне форума Ответить с цитированием
Старый 17.08.2015, 20:37   #3
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Похоже, что get_documentElement возвращает пустой pElem.
Судя по всему, страница еще не загрузилась.
Почему ты так думаешь? У меня стоит проверка на полную загрузку
Код:
AfxBeginThread(ThreadProc1,dil); //Запуск потока в котором вызывается Navigate
Sleep(3000);
int count=0;
while(m_brows.get_ReadyState()!=4)
{
	TRACE("not get_ReadyState=%d count=%d\n",m_brows.get_ReadyState(),count);
	Sleep(2000);
	count++;
	if((count==5)&&(m_brows.get_ReadyState()==3))
		break;
	if(count==5)
		count=0;
}
TRACE("yes get_ReadyState=%d\n",m_brows.get_ReadyState());
Sleep(3000);
IDispatch* pDis=NULL;

pDis=m_brows.get_Document();
if(pDis!=NULL)
{
	CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> pADocument3;
	pADocument3=pDis;
	IHTMLElement* html;
	pADocument3->get_documentElement(&html);
	BSTR temp;
	html->get_innerHTML(&temp);
}
чуточку код изменил через смарт указатели, но все рамно вылетает на этой же строчке "html->get_innerHTML(&temp);" тоже самое исключение. Как мне полностью загрузить документ? У меня Navigate вызывается из другого потока, а в этом потоке я потом проверяю загрузку в цикле. мб. что не так делаю?

Последний раз редактировалось ninja2; 17.08.2015 в 20:39.
ninja2 вне форума Ответить с цитированием
Старый 17.08.2015, 20:41   #4
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Оно от только что я нажал на кнопку нормально загрузило все, если второй раз нажму на кнопку может не загрузить, а бывает с первого раза не загружает. хз. что за дела.
ninja2 вне форума Ответить с цитированием
Старый 17.08.2015, 20:42   #5
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Я кажется догадываюсь мб. у меня одновременно два потока работает и в одном загрузило, а во вротом подгружает только и оно сбивается? Да это я уже наверно выдумываю. хз. Если бы с потоками были проблемы то оно бы не вылетало на первой загрузке, а так от только перекомпелировал кликнул по кнопке и вылетело на первой загрузке.

я потоки не сильно знаю, просто их вызываю и все, а ниче не проверяю. мб. их как то уничтожать нада?

у меня в коде получается два потока одновременно используют одну и туже переменную m_brows, Один вызывает из одного потока вызывается поток который вызывает Navigate, а потом через 3 секунды чтобы успел вызваться Navigate идет проверка readyState и два потока одновременно обращаются к одной переменной m_brows мб. из за этого ошибка? хз.

Последний раз редактировалось ninja2; 17.08.2015 в 20:57.
ninja2 вне форума Ответить с цитированием
Старый 17.08.2015, 21:11   #6
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Вот код я в одном потоке использую и он все рамно вылетает если строчку раскоментировать
Код:
m_brows.Navigate(url,NULL,NULL,NULL,NULL);
	Sleep(3000);
	int count=0;
	while(m_brows.get_ReadyState()!=4)
	{
		TRACE("not get_ReadyState=%d count=%d\n",m_brows.get_ReadyState(),count);
		Sleep(2000);
		count++;
		if((count==5)&&(m_brows.get_ReadyState()==3))
			break;
		if(count==5)
			count=0;
	}
	TRACE("yes get_ReadyState=%d\n",m_brows.get_ReadyState());
	Sleep(3000);
	IDispatch* pDis=NULL;
	
	pDis=m_brows.get_Document();
	IHTMLElement* html=NULL;
	if(pDis!=NULL)
	{
		CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> pADocument3;
		pADocument3=pDis;

		
		if(pADocument3->get_documentElement(&html)==S_OK)
		{
			BSTR temp;
		/*	if(html!=NULL)
				html->get_innerHTML(&temp);*/
		}
	}
Как исправить, че оно вылетает не ясно, страница вроде загружена
ninja2 вне форума Ответить с цитированием
Старый 17.08.2015, 21:59   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Navigate, get_ReadyStatus и все осталные методы следует вызывать *только* из потока, который создал WebBrowser объект.

Sleep блокирует программу - пока поток спит browser объект данные *не качает*.

Для работы WebBrowser объекта нужна обработка очереди сообщений GetMessage / DispatchMessage.
waleri вне форума Ответить с цитированием
Старый 17.08.2015, 22:23   #8
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Navigate, get_ReadyStatus и все осталные методы следует вызывать *только* из потока, который создал WebBrowser объект.

Sleep блокирует программу - пока поток спит browser объект данные *не качает*.

Для работы WebBrowser объекта нужна обработка очереди сообщений GetMessage / DispatchMessage.
Я понял в интернете вычитал что нужно смотреть маршалинг и апартмент, я это смутно понимаю, знаю что связано с потоковой безопасностью что то. помню что если free то вроде потокобезопасно, а если apartment не помню что. Нужно смотреть значение какое для COM стоит и тогда делать или в одном потоке или в нескольких.

что Sleep полностью блокирует? я думал он цикл заблокировал (поток в котором цикл), а поток в котором вызвана функция Navigate работает.

А что такое очередь сообщений GetMessage / DispatchMessage????? Это нужно самому генерировать свои собственные сообщения? От к примеру при нажатии на кнопку я генерирую сообщение WM_MY_MESSAGE которая вызывает обработчик - функцию. по идее окно с кнопками уже не зависнет. Дальше я в этом обработчике вызываю еще одно свое собственное сообщение в функции которой будет вызвана Navigate, а в этом же обработчике буду проверять ReadyState. В таком стиле.Просто все в одном диалоговом классе все делать. Посыл своих собственных сообщений и отлов это называется GetMessage/DispatchMessage?????
Еще нормального ни одного приложения на MFC не сделал. Можно вроде таймеры использовать.

Да кстати Sleep работает, я от вспомнил он останавливает только один поток, а другой поток в котором была вызвана Navigate он продолжал подгружать страницу. Потому что если без Sleep у меня не успевал поток в котором вызыван Navigate изменить readyState и у меня показывало что сразу документ загружен и я не мог получить указатель на документ. Так что Sleep только останавливает тот поток в котором вызван.

Последний раз редактировалось ninja2; 17.08.2015 в 22:28.
ninja2 вне форума Ответить с цитированием
Старый 17.08.2015, 22:43   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ваш (последний) пример содержал и Navigate и get_ReadyState в одном потоке в перемежку со Sleep. В этом случае Sleep блокирует работу WebBrowser объекта.

https://en.wikipedia.org/wiki/Messag...rosoft_Windows
waleri вне форума Ответить с цитированием
Старый 17.08.2015, 22:47   #10
ninja2
Форумчанин
 
Регистрация: 13.08.2015
Сообщений: 193
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ваш (последний) пример содержал и Navigate и get_ReadyState в одном потоке в перемежку со Sleep. В этом случае Sleep блокирует работу WebBrowser объекта.

https://en.wikipedia.org/wiki/Messag...rosoft_Windows
Ну да .

С GetMessage / DispatchMessage похоже сложно будет разобраться )))
ninja2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Mutex нарушение прав доступа при чтении по адресу Eugenelife Помощь студентам 0 15.12.2013 13:13
c++ нарушение прав доступа при чтении по адресу 0x00000000 proef Помощь студентам 7 05.09.2013 23:49
Нарушение прав доступа при чтении Павел Гайдаржи Помощь студентам 0 11.11.2012 19:45
Нарушение прав доступа при чтении попытка вторая Farrel Общие вопросы C/C++ 5 24.02.2011 12:01
нарушение прав доступа при чтении Farrel Общие вопросы C/C++ 1 22.02.2011 00:32