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

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

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

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

26.01.2012, 21:08. Просмотров 1395. Ответов 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:
Посмотрите здесь:

Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по - C++
Здравствуйте! Функция должна искать локальные минимумы массива. То есть это элементы,которые меньше своих соседей. Дело в том,что функция...

Необработанное исключение по адресу 0x4050D302 в ConsoleApplication17.exe: 0xC0000005: Access violation (параметры: 0x00000008) - C++
Добрый вечер. Я в сети нашел программу градиентному методу дробления шага и изменил в ней функцию на свою и градиенты на свои, но почему то...

Необработанное исключение - C++
Добрый день! разобравшись с предыдущими ошибками, я столкнулся с новой. содержимое: Level.h #ifndef LEVEL_H #define LEVEL_H ...

Необработанное исключение: "Нарушение прав доступа при записи" - C++
Подскажите в чём проблемма происходит ошибка при выполнение программы #include <iostream> #include <string> using namespace std; ...

Необработанное исключение - C++
Всем привет! Совсем недавно начал писать на C++. Делаю курсовую работу. Программа моделирует процесс и полученные значения записывает...

Необработанное исключение - C++
Доброго времени суток. Ошибка: Необработанное исключение типа "System.Resources.MissingManifestResourceException" в mscorlib.dll ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 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 - <Неправильный указатель>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 22:30     GetModuleFileNameW Необработанное исключение 0xC0000005:
Еще ссылки по теме:

Необработанное исключение - C++
есть программный код на поиск самой длинной последовательности чисел в файле с последующим её копированием в другой файл #include...

Необработанное исключение - C++
Здравствуйте. Подскажите, в чем может быть ошибка в этой строке? view-&gt;web_view()-&gt;Resize(LOWORD(lParam), HIWORD(lParam)); VS 2013...

Необработанное исключение - C++
Здравствуйте! При полном заполнении массива пятью значениями, программа зависает ненадолго, и выскакивает ошибка (см.вложение). Такжево...

Необработанное исключение - C++
При компиляции кода #include &lt;fstream&gt; const int block_size = 8; const int char_size = 8; const int conversions = 8; const int...


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

Или воспользуйтесь поиском по форуму:
DU
1482 / 1058 / 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:
Ответ Создать тему
Опции темы

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