0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 30
|
|
1 | |
GetModuleFileNameW Необработанное исключение 0xC0000005:26.01.2012, 21:08. Просмотров 1772. Ответов 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; } Необработанное исключение в "0x77bd4234" в "nfgue2qt.exe": 0xC0000005: Нарушение прав доступа при записи "0x014166c8"
0
|
|
26.01.2012, 21:08 | |
Необработанное исключение по адресу 0x0000000077651DA0 (ntdll.dll) в ProjecktExperement2.exe: 0xC0000005: нарушение прав Необработанное исключение по адресу 0x4050D302 в ConsoleApplication17.exe: 0xC0000005: Access violation (параметры: 0x00000008) Необработанное исключение по адресу 0x00E730CD в ConsoleApplication18.exe: 0xC0000005: нарушение прав доступа при чтении |
|
1492 / 1138 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
26.01.2012, 21:13 | 2 | |||||
LPWSTR LPWSTRfullPath; - это просто неинициализированный указатель.
GetModuleFileName(NULL, LPWSTRfullPath, sizeof LPWSTRfullPath ); в функцию вы должны отдать указатель на массив широких символов и размер этого массива, чтобы функция скопировала в этот массив имя модуля. Вот примерно так должно выглядеть. Без проверок тут написал
1
|
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
|
1492 / 1138 / 165
Регистрация: 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
|