Как сохранить значение в строку с RegOpenKeyEx? - PullRequest
0 голосов
/ 05 октября 2010

Мне нужно получить путь из реестра. Следующий код работает за исключением последней части, где я храню путь к строке. При запуске отладчика в Visual Studio 2008 массив char имеет путь, но все остальные символы - ноль. Это приводит к тому, что строке присваивается только первая буква. Я попытался изменить char res[1024] на char *res = new char[1024], и это просто заставляет его хранить первую букву в массиве символов вместо строки. Остальной программе нужен путь в виде строкового типа данных, поэтому он не может оставаться массивом символов. Что мне здесь не хватает?

unsigned long type=REG_SZ, size=1024;
string path;
char res[1024];
HKEY key;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Classes\\dsn\\shell\\open\\command"), NULL, KEY_READ, &key)==ERROR_SUCCESS){

    RegQueryValueEx(key,
    NULL,// YOUR value
    NULL,
    &type,
    (LPBYTE)res,
    &size);
    RegCloseKey(key);

    path = string(res);
}

Ответы [ 3 ]

2 голосов
/ 05 октября 2010

Вы получаете строку Unicode, но присваиваете ей строку на основе символов.

Вы можете переключить класс пути на tstring или wstring или использовать RegQueryValueExA (A дляASCII).

0 голосов
/ 05 октября 2010

Для C ++ вы можете предпочесть доступ к Реестру с помощью вспомогательного класса ATL CRegKey .Метод хранения строковых значений: QueryStringValue .Существуют и другие (в некоторой степени) безопасные для типов методы для извлечения и установки различных типов значений реестра.

Это не лучший интерфейс C ++ (например, нет поддержки std::string), но немного более плавный, чем собственный Win32.

0 голосов
/ 05 октября 2010

Вы компилируете в Юникоде. Перейдите в «Настройки проекта»> «Свойства конфигурации»> «Основные», измените «Набор символов» на «Не указан» и перестройте проект.

RegOpenKey - это макрос, определенный в заголовках WINAPI. Если Юникод включен, он разрешается до RegOpenKeyW, если нет, то он разрешается до RegOpenKeyA. Если вы хотите продолжить компиляцию в юникоде, вы можете просто вызвать RetgOpenKeyA напрямую, а не использовать макрос.

В противном случае вам придется иметь дело со строками Unicode, которые, при необходимости, также могут помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...