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

Нарушение прав доступа при чтении - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
02.02.2011, 18:01     Нарушение прав доступа при чтении #1
Имею функцию такого плана:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void RenameOldLabels()
{
    USES_CONVERSION;
    string path, pathAfterRename, pathToDelFile, pathToDelDir, copyCom;
    wchar_t* DesktopFolder = new wchar_t;
    wchar_t* StartPrograms = DesktopFolder;
    try 
    {
        SHGetSpecialFolderPathW(0, DesktopFolder, CSIDL_COMMON_DESKTOPDIRECTORY, false);
        path = W2A(DesktopFolder);// здесь то исключение, то нет. 
        pathAfterRename = W2A(DesktopFolder);
        }
catch (...)
{}
}
Пометил, где исключение. Нарушение прав доступа при чтении. НЕ могу понять причину. То нормально все, то не работает. Как отследить ? Вероятно я опять чтото с памятью не то делаю... :\

UPD1. wchar_t* DesktopFolder = new wchar_t[MAX_PATH]; Вроде норм.
Такой вопрос тогда. Какие книги по работе с выделению памяти, с обращениями к ней, могут посоветовать уважаемые пользователи форума?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2011, 18:01     Нарушение прав доступа при чтении
Посмотрите здесь:

Нарушение прав доступа при чтении C++
C++ Нарушение прав доступа при чтении
Нарушение прав доступа при чтении C++
C++ Нарушение прав доступа при чтении
C++ Нарушение прав доступа при чтении
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bobrovskii
57 / 57 / 3
Регистрация: 22.01.2011
Сообщений: 187
02.02.2011, 21:04     Нарушение прав доступа при чтении #2
zulkis, W2A что делает?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
02.02.2011, 22:23  [ТС]     Нарушение прав доступа при чтении #3
Conversion Macros
bobrovskii
57 / 57 / 3
Регистрация: 22.01.2011
Сообщений: 187
02.02.2011, 22:39     Нарушение прав доступа при чтении #4
zulkis, не совсем понятно зачем вызывать SHGetSpecialFolderPathW если в итоге нужен char тип (ANSI)? воспользуйся SHGetSpecialFolderPathA, или я чего то не понял...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.02.2011, 23:44     Нарушение прав доступа при чтении #5
Цитата Сообщение от zulkis Посмотреть сообщение
wchar_t* DesktopFolder = new wchar_t;
А я вот этого момента не понял. Зачем создавать один символ в динамической памяти? Может
C++
1
wchar_t* DesktopFolder = new wchar_t[MAX_PATH];
или что-то вроде того?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
03.02.2011, 12:09  [ТС]     Нарушение прав доступа при чтении #6
easybudda, Ага, я в UPD написал. Вероятно в мозгу была ЖЕСТЬ :|
А насчет SHGetSpecialFolderPathW - Вся программа в UNICODE :dance3:
Не я изначально писал.
И даже если бы вызовешь по логике обычный SHGetSpecialFolderPath дойдет до след. кода:
C++
1
2
3
4
5
#ifdef UNICODE
#define SHGetSpecialFolderPath  SHGetSpecialFolderPathW
#else
#define SHGetSpecialFolderPath  SHGetSpecialFolderPathA
#endif // !UNICODE
bobrovskii
57 / 57 / 3
Регистрация: 22.01.2011
Сообщений: 187
03.02.2011, 12:25     Нарушение прав доступа при чтении #7
zulkis, с буковкой A не дойдет SHGetSpecialFolderPathA )))
Извените но я ни как въехать не могу что код делает?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
03.02.2011, 12:43  [ТС]     Нарушение прав доступа при чтении #8
C++
1
SHGetSpecialFolderPathW(HWND hwnd, LPWSTR pszPath, int csidl, BOOL fCreate);
- функция, которая получает путь до папки, которая устанавливается ключем
C++
1
(CSIDL_COMMON_DESKTOPDIRECTORY)
в третьем принимаемом значении. В данном варианте в DesktopFolder на выходе будет путь до общего рабочего стола(All Users).
И функция, и все ключи хранятся в shlobj.h.
Это отвязывает от разных версии Windows. Всегда можно получить доступ к одному и тому же стандартному месту в Windows, к примеру C:\Windows. А вдруг это у Вас D:\Windows? Тогда Если внутри программы вы забили ваш путь ручками программа просто в лучшем случае вам ошибку выдаст.
Это если я правильно понял что по функции не понятно. А если в целом по коду - Это часть, не было смысла всю функцию сюда копировать. Дальше идет множественное переименование ярлычков, папок, и просто веселые вещи )
Надеюсь понятно объяснил. Привел бы ссылку, но правила...
bobrovskii
57 / 57 / 3
Регистрация: 22.01.2011
Сообщений: 187
03.02.2011, 13:04     Нарушение прав доступа при чтении #9
zulkis, я прекрасно знаю что делает SHGetSpecialFolderPath не пойму на кой макросы все эти.
Как я понял получаем путь desk_dir в wchar_t, далее с помощью непонятного мне макроса хотим получить char, так?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
03.02.2011, 15:44  [ТС]     Нарушение прав доступа при чтении #10
bobrovskii, Попросту любой другой вариант кроме этих макросов мне выбрасывал крякозябры. :\
Ну или я не знаю чего-то такого, что знают некоторые ) А вот эти макросы меня спасли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2011, 16:04     Нарушение прав доступа при чтении
Еще ссылки по теме:

C++ нарушение прав доступа при чтении по адресу
C++ Нарушение прав доступа при чтении
Ошибка: Нарушение прав доступа при чтении C++

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

Или воспользуйтесь поиском по форуму:
bobrovskii
57 / 57 / 3
Регистрация: 22.01.2011
Сообщений: 187
03.02.2011, 16:04     Нарушение прав доступа при чтении #11
zulkis, для этих нужд имеется
C
1
WideCharToMultiByte
как с ней быть вкурсе?

Добавлено через 1 минуту
конвектирует wchar_t(UNICODE STRING) to char(ANSI STRING)

Добавлено через 9 минут
а если не быть многословным
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void t()
{
    char desk_dir[MAX_PATH];
    char after_desk_dir[MAX_PATH];
    wchar_t ucs_desk_dir[MAX_PATH];
 
    if (SHGetSpecialFolderPathW(0, ucs_desk_dir, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE)) {
        WideCharToMultiByte(CP_ACP, 0, ucs_desk_dir, -1, desk_dir, MAX_PATH, NULL, NULL);
        lstrcpy(after_desk_dir, desk_dir);
 
        // desk_dir и after_desk_dir - пути к DESKTOPDIRECTORY в ANSI STRING
        // ucs_desk_dir - в UNICODе
    }
}
Получаем путь в UNICODE с помощью WideCharToMultiByte конвектируем в ANSI STRING
Yandex
Объявления
03.02.2011, 16:04     Нарушение прав доступа при чтении
Ответ Создать тему
Опции темы

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