Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

26.01.2012, 21:08. Просмотров 1444. Ответов 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"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2012, 21:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос GetModuleFileNameW Необработанное исключение 0xC0000005: (C++):

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

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

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09 - C++
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение прав доступа при чтении по адресу...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC - C++
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));,...

Необработанное исключение в "0x776315de" в "c++1.exe": 0xC0000005: Нарушение прав доступа при записи "0x40e000 - C++
Здравствуйте. Только начал работать с динамическим массивом, но не могу понять почему появляется эта ошибка. Работаю с библиотекой sfml....

Необработанное исключение в "0x104b2288" в "Matrix.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcd - C++
Вот такая ошибка!

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

Вот примерно так должно выглядеть. Без проверок тут написал
C++
1
2
WCHAR fullPath[MAX_FILE_PATH] = {0};
GetModuleFileName(NULL, fullPath, sizeof(fullPath)/sizeof(*fullPath) );
Ну и нигде нет обработки ошибок. Нет гарантии что запрашиваемое имя влезет в предоставленный буффер например. Ну и прочее. Обработка ошибок занимает не малую часть от общего кода. Иначе глюки постоянно непонятно где будут всплывать.
1
FYBVFPFYBC
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 30
26.01.2012, 22:18  [ТС] #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 - <Неправильный указатель>
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.01.2012, 22:30 #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);

Ну и общий совет. Освойте дебагер. С ним легче. Ошибки возникают всегда. С дебагером их проще и быстрее самостоятельно находить. Потраченное время на изучение дебагера окупится многократно.
1
26.01.2012, 22:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 22:30
Привет! Вот еще темы с ответами:

Необработанное исключение в "0x0138169d" в "kursovaya.exe": 0xC0000005: Нарушение прав доступа при чтении "0x6 - C++
Программа выдает ошибку, может кто видит где? и как исправить Код: #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cmath&gt; using...

Необработанное исключение в "0x01082855" в "sort.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc" - C++
Всем привет! помогите мне понять в чём дело. написал программу: #include &quot;stdafx.h&quot; #include &lt;ctime&gt; #include &lt;iostream&gt; #include...

Необработанное исключение в "0x778e15de" в "dir-3.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000" - C++
#include &lt;windows.h&gt; #include &lt;d3d9.h&gt; LRESULT __stdcall WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); struct...

Необработанное исключение в "0x013f2b22" в "123.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd" - C++
Вот функция для удаления столбца: #pragma once #include &lt;iostream&gt; using namespace std; int **DeleteIndexCol(int **ar,int s1,int...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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