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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2012, 23:10   #1
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию 2 проблемы

Доброго времени суток!
Опять проблема, на этот раз в одной функции, по сути главной во всей программе.

Код:
void CheckCupPage(void)
{
	/*MessageBox(NULL, TEXT("Houston, we have a problem."),TEXT("Watch!"), MB_OK);
	HANDLE hOpenFile;
	hOpenFile = (HANDLE)OpenFile("C\\Skrins\\file1.txt", NULL, OF_CREATE |OF_READWRITE | OF_SHARE_EXCLUSIVE);
	if(hOpenFile != INVALID_HANDLE_VALUE)
	{*/
		HINTERNET hInetSession;
		HINTERNET hUrl;
		LPSTR buf[1024];
		WCHAR buf2[2048];
		DWORD br;
            
		hInetSession = InternetOpen(TEXT("Checker"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);
		hUrl = InternetOpenUrl(hInetSession, TEXT("http://check.ru/check"), NULL, NULL, NULL, NULL);
		//do
		//{
			InternetReadFile(hUrl, buf, (DWORD)1024, &br);
			InternetCloseHandle(hUrl);
			InternetCloseHandle(hInetSession);


			MultiByteToWideChar(CP_ACP, 0, (LPCSTR)buf, strlen((LPCSTR)buf) + 1,buf2, sizeof(buf2)/sizeof(WCHAR));
		//}while(br);
		//MessageBox(NULL, ShowLastError(), TEXT("Error with Inet!"), MB_OK);
		HANDLE hFile = CreateFile(TEXT("C:\\Skrins\\file1.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		WriteFile(hFile, (LPVOID)buf, sizeof(buf2), NULL, NULL);
		//CloseHandle(hFile);
	/*}
	else
	{
		MessageBox(NULL, ShowLastError(), TEXT("Error with open file!"), MB_OK);
	}*/
}

Выскакивает ошибка:
Код:
Unhandled exception at 0x756e764a in Skillz.exe: 0xC0000005: Access violation writing location 0x00000000.
Помойму с записью в файл проблема, но не пойму в чём именно. Ошибка выскакивает в процессе работы программы. Как я понимаю, выходит за границы символьного массива buf2?

Вторая проблема заключается в том, что загружаемая страничка не переваривает кириллицу, функция MultiByteToWideChar вроде бы правильно используется.
Может где то не то написал?
hvz- вне форума Ответить с цитированием
Старый 03.12.2012, 02:24   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

LPSTR этот тип равен char*
как вы думаете массив чего вы обьявили?
ведь до того как вы поставили каст при вызове MultiByteToWideChar(точнее даже додумались до этого), вам компилятор ошибку писал не спроста.

а второе, вы конвентируете из анси1251, а на страницах обычно UTF8, чем функция не занимается(вроде как)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.12.2012, 09:07   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А вы точно уверенны, что второй аргумент OpenFile может быть NULL?
OpenFile - очень древняя функция, рекомендуется использовать CreateFile()
Зачем всюду делать typecast - (DWORD), (LPCSTR)? Если можно сделать преобразование, компилятор сделает его сам, а если нельзя, то лучше его не делать вообще.
waleri вне форума Ответить с цитированием
Старый 03.12.2012, 22:27   #4
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А вы точно уверенны, что второй аргумент OpenFile может быть NULL?
OpenFile - очень древняя функция, рекомендуется использовать CreateFile()
Вот попытался CreateFile использовать в качестве проверки существования файла, и всё равно не правильно работает.

Код:
	HANDLE hOpenFile;
	hOpenFile = CreateFile(TEXT("C:\\Skrins\\out.txt"), 
							NULL, 
							FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 
							NULL, 
							OPEN_EXISTING, 
							FILE_ATTRIBUTE_NORMAL, 
							NULL);

	if(hOpenFile) // если файл можно открыть (т.е. существует)
	{
		CloseHandle(hOpenFile); // закрываем поток файла
		MessageBox(NULL, TEXT("File already exist!"), TEXT("Error!"), MB_OK | MB_ICONERROR);
	}
	else // если файла не существует
	{
		//CloseHandle(hOpenFile); // закрываем поток файла
		MessageBox(NULL, TEXT("File fon't exist"), TEXT("Error!"), MB_OK | MB_ICONERROR);
		HINTERNET hInetSession, hUrlToOpen;
		char buffer[1024];
		DWORD dwBytesRead;
		BOOL bResult;

		hInetSession = InternetOpen(TEXT("Checker"), 
									INTERNET_OPEN_TYPE_PRECONFIG, 
									NULL, NULL, NULL);
		
		hUrlToOpen = InternetOpenUrl(hInetSession, 
									TEXT("http://check.ru/check"), 
									NULL, NULL, NULL, NULL); //Создаём соединение с страницей

		bResult = InternetReadFile(hUrlToOpen, buffer, 1024, &dwBytesRead); // скачиваем её
		InternetCloseHandle(hUrlToOpen);
		InternetCloseHandle(hInetSession);

		if(bResult == 1)
			MessageBox(NULL, (LPCWSTR)buffer, TEXT("Warning!"), MB_OK);

		HANDLE hCreateFile;
		hCreateFile = CreateFile(TEXT("C:\\Check\\out.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		WriteFile(hCreateFile, buffer, sizeof(buffer), NULL, NULL);
		CloseHandle(hCreateFile);
	}
При записи выскакивает ошибка Unhandled exception at 0x757e764a in Check.exe: 0xC0000005: Access violation writing location 0x00000000.
У меня уже голова кругом, что же ему не нравится. Саму функцию вызывает таймер, может в этом причина? И как заставить читать юникод?

Последний раз редактировалось hvz-; 03.12.2012 в 22:54.
hvz- вне форума Ответить с цитированием
Старый 03.12.2012, 23:08   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

неверный хендл равен INVALID_HANDLE_VALUE, а не 0 как вы считаете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.12.2012, 23:34   #6
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
неверный хендл равен INVALID_HANDLE_VALUE, а не 0 как вы считаете.
Благодарю, опять моя невнимательность виновата, не обратил внимание когда мсдн читал)

И каким то чудом киррилицу начал кушать, даже не понимаю как. Но ошибка всё та же:
Цитата:
Unhandled exception at 0x757e764a in Skillz.exe: 0xC0000005: Access violation writing location 0x00000000.
Вот обновленный код:
Код:
HANDLE hOpenFile = CreateFile(TEXT("C:\\Test\\out.txt"), 
							GENERIC_READ, 
							NULL, 
							NULL, 
							OPEN_EXISTING, 
							FILE_ATTRIBUTE_NORMAL, 
							NULL);

	if(hOpenFile != INVALID_HANDLE_VALUE) // если файл можно открыть (т.е. существует)
	{
		CloseHandle(hOpenFile); // закрываем поток файла
		MessageBox(NULL, TEXT("File already exist!"), TEXT("Error!"), MB_OK | MB_ICONERROR);
	}
	else if (hOpenFile == INVALID_HANDLE_VALUE)// если файла не существует
	{
		CloseHandle(hOpenFile); // закрываем поток файла
		MessageBox(NULL, TEXT("We can create file."), TEXT("Gratz!"), MB_OK | MB_ICONINFORMATION);
		const int SIZE = 4096;
		HINTERNET hInetSession, hUrlToOpen;
		char buffer[SIZE];
		DWORD dwBytesRead;
		BOOL bResult;

		hInetSession = InternetOpen(TEXT("Checker"), 
									INTERNET_OPEN_TYPE_PRECONFIG, 
									NULL, NULL, NULL);
		
		hUrlToOpen = InternetOpenUrl(hInetSession, 
									TEXT("http://check.ru/check"), 
									NULL, NULL, NULL, NULL); //Создаём соединение с страницей

		bResult = InternetReadFile(hUrlToOpen, buffer, SIZE, &dwBytesRead); // скачиваем её
		InternetCloseHandle(hUrlToOpen);
		InternetCloseHandle(hInetSession);

		if(bResult == 1)
			MessageBoxA(NULL, buffer, "Warning!", MB_OK);

		HANDLE hCreateFile;
		hCreateFile = CreateFile(TEXT("C:\\Test\\out.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		WriteFile(hCreateFile, buffer, sizeof(buffer), NULL, NULL);
		CloseHandle(hCreateFile);
Не понимаю в чём проблема, ошибка выскакивает после messagebox с скачанной страничкой.
hvz- вне форума Ответить с цитированием
Старый 03.12.2012, 23:50   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

hvz-

Не понимаю в чём проблема,

гоогле "что такое отладчик" и "как отлаживать код"
Rififi вне форума Ответить с цитированием
Старый 03.12.2012, 23:53   #8
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
hvz-

Не понимаю в чём проблема,

гоогле "что такое отладчик" и "как отлаживать код"
Я пытался в самой студии при помощи F10, F11 дойти до функции и посмотреть, но доходит только до цикла обработки сообщений и всё.
hvz- вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++. проблемы с gets() Skull_psyhothik Помощь студентам 1 03.10.2012 01:10
Проблемы с while cashmail JavaScript, Ajax 4 29.06.2012 21:08
проблемы с Qt CodeNOT Qt и кроссплатформенное программирование С/С++ 3 27.03.2012 12:17
Проблемы из-за 7-ки? nimbus2000 Помощь студентам 4 09.02.2012 17:35
Проблемы с БД Verwolf C/C++ Базы данных 2 22.05.2011 09:52