Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
FYBVFPFYBC
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 30
#1

GetModuleFileNameW Необработанное исключение 0xC0000005: - C++

26.01.2012, 21:08. Просмотров 1363. Ответов 3
Метки нет (Все метки)

Здравствуйте. Суть проблемы:
Программа использует ANSI и UNICODE библиотеки.
В функцию передаётся имя файла в ANSI.
C помощью GetModuleFileNameW вычисляю путь к файлу в UNICODE (т.к. используется UNCODE-WinAPI).
Конвертирую UNICODE-путь в ANSI-путь, который и возвращает функция.

Код
char fullPath[_MAX_PATH];
char *AddMediaPath(const char *filename)
{
	LPWSTR LPWSTRfullPath;
	GetModuleFileName(NULL, LPWSTRfullPath, sizeof LPWSTRfullPath );
	PathRemoveFileSpec(LPWSTRfullPath);
	MultiByteToWideChar( 0, 0, fullPath, -1, LPWSTRfullPath, sizeof LPWSTRfullPath / sizeof fullPath );
	sprintf(fullPath, "%s%s%s", fullPath, "\\", filename);
	return fullPath;
}
Ошибка во время выполнения на этапе GetModuleFileName:

Необработанное исключение в "0x77bd4234" в "nfgue2qt.exe": 0xC0000005: Нарушение прав доступа при записи "0x014166c8"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2012, 21:08     GetModuleFileNameW Необработанное исключение 0xC0000005:
Посмотрите здесь:

C++ Необработанное исключение
Необработанное исключение по адресу 0x4050D302 в ConsoleApplication17.exe: 0xC0000005: Access violation (параметры: 0x00000008) C++
Необработанное исключение C++
C++ Необработанное исключение
C++ Необработанное исключение
C++ Необработанное исключение
C++ Необработанное исключение
C++ Необработанное исключение
Необработанное исключение C++
C++ Необработанное исключение
C++ Необработанное исключение
C++ Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.01.2012, 21:13     GetModuleFileNameW Необработанное исключение 0xC0000005: #2
LPWSTR LPWSTRfullPath; - это просто неинициализированный указатель.
GetModuleFileName(NULL, LPWSTRfullPath, sizeof LPWSTRfullPath );
в функцию вы должны отдать указатель на массив широких символов и размер этого массива, чтобы функция скопировала в этот массив имя модуля.

Вот примерно так должно выглядеть. Без проверок тут написал
C++
1
2
WCHAR fullPath[MAX_FILE_PATH] = {0};
GetModuleFileName(NULL, fullPath, sizeof(fullPath)/sizeof(*fullPath) );
Ну и нигде нет обработки ошибок. Нет гарантии что запрашиваемое имя влезет в предоставленный буффер например. Ну и прочее. Обработка ошибок занимает не малую часть от общего кода. Иначе глюки постоянно непонятно где будут всплывать.
FYBVFPFYBC
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 30
26.01.2012, 22:18  [ТС]     GetModuleFileNameW Необработанное исключение 0xC0000005: #3
Код
char fullPath[_MAX_PATH];
char *AddMediaPath(const char *filename)
{
	WCHAR LPWSTRfullPath[65536] = {0};
	GetModuleFileName(NULL, LPWSTRfullPath, sizeof(LPWSTRfullPath)/sizeof(*LPWSTRfullPath) );
	PathRemoveFileSpec(LPWSTRfullPath);
	MultiByteToWideChar( 0, 0, fullPath, -1, LPWSTRfullPath, sizeof LPWSTRfullPath / sizeof fullPath );
	sprintf(fullPath, "%s%s%s", fullPath, "\\", filename);
	return fullPath;
}
Спасибо, первые несколько десятков вызовов прошли успешно. Потом появилось вот это:

Необработанное исключение в "0x774b007c" в "nfgue2qt.exe": 0xC0000096: Privileged instruction.

Функция вызывается из тривиального инкрементирующего цикла, изменяется только параметр filename. Буду благодарна, если посоветуете как реализовать обработку ошибок в данном случае. GetLastError()?

Добавлено через 6 минут
Ошибка всплывает на том же месте. LPWSTRfullPath - <Неправильный указатель>
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.01.2012, 22:30     GetModuleFileNameW Необработанное исключение 0xC0000005: #4
не понятно где у вас там ошибки

WCHAR LPWSTRfullPath[65536] = {0}; - такой массив на стеке создавать - это очень круто.

PathRemoveFileSpec(LPWSTRfullPath); - нужно вызывать для широких символов. т.е. PathRemoveFileSpecW

MultiByteToWideChar( 0, 0, fullPath, -1, LPWSTRfullPath, sizeof LPWSTRfullPath / sizeof fullPath );
тут вы пытаетесь из мультибайта переложить в широкие символы. а задумывалось все наоборот.
Наверно надо WhileChar to MultiBute.

sizeof LPWSTRfullPath / sizeof fullPath - неверное определение размера буфера. Верное такое:
sizeof(array)/sizeof(*array);

Ну и общий совет. Освойте дебагер. С ним легче. Ошибки возникают всегда. С дебагером их проще и быстрее самостоятельно находить. Потраченное время на изучение дебагера окупится многократно.
Yandex
Объявления
26.01.2012, 22:30     GetModuleFileNameW Необработанное исключение 0xC0000005:
Ответ Создать тему
Опции темы

Текущее время: 14:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru