RegGetValue Вопрос - PullRequest
       7

RegGetValue Вопрос

2 голосов
/ 10 июня 2011

Я пытаюсь написать (как мне казалось, будет) простой скрипт на C ++ для поиска в реестре (в частности, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Uninstall) и вернуть значение значения DisplayName.

Я просмотрел документы MSDN и несколько часов поиска в Google, к сожалению, я застрял.

#define BUFFER 8192
char value[255];
DWORD BufferSize = BUFFER;

if(RegGetValue(HKEY_LOCAL_MACHINE,
    _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"),
    _T("DisplayName"),
    RRF_RT_ANY,
    NULL,
    (PVOID)&value,
    &BufferSize)
    )
{
    _tprintf(TEXT("(%d) %s - %s\n"), i+1, achKey, value);
}

Теперь мне нужно иметь возможность добавить achKey ко 2-му параметру RegGetValue, чтобы он получал правильные значения при циклическом просмотре каждого подраздела.

Я пробовал миллион разных вещей, к сожалению, мой опыт в C ++ довольно ограничен, и мои навыки работы с Google, видимо, тоже требуют некоторой работы.

Edit: achKey - это имя ключа: Пример: драйверы NVIDIA

Поэтому при добавлении второй параметр должен выглядеть следующим образом:

SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NVIDIA Drivers

Вот ссылка на MSDN на RegGetValue: http://msdn.microsoft.com/en-us/library/ms724868%28v=vs.85%29.aspx

Я также пробовал что-то вроде:

wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)

Он скомпилируется, но затем при запуске вылетает.

Ответы [ 3 ]

4 голосов
/ 10 июня 2011

Я вижу две основные проблемы с вашим исходным кодом:

  1. Смешивание строк Unicode / ACSII : Из ваших комментариев видно, что вы компилируете проект со строками Unicode, но используете char value[255]. Используйте wchar_t или TCHAR вместо char. функция RegGetValue() будет автоматически «перенаправлена» на функции RegGetValueW() или RegGetValueA() в зависимости от настроек Unicode проекта. Если вы хотите использовать определенный набор символов, вы можете использовать эти функции напрямую, но обычно лучше просто использовать функцию RegGetValue() напрямую.
  2. Переполнение буфера: Вы используете буфер символов 255 элементов, но размер буфера равен 8192. Если ключ реестра больше 255 байтов (не символов), вы переполните этот буфер, и вы вещи будут происходить. Убедитесь, что вы передаете точный размер буфера или меньше. Также следует помнить о различиях между байтами и символами в строках Unicode. Некоторые функции могут ожидать или возвращать размер буфера в байтах, а некоторые в символах.

Следующий код является примером использования широких строк по вашему желанию:

#include <iostream>
#include <string>

    ...
std::wstring BaseKey(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"));
std::wstring achKey(_T("DisplayName"));
std::wstring NewKey;

NewKey = BaseKey + achKey;
wcout << NewKey << _T("\n");
NewKey = BaseKey + _T("AnotherName");
wcout << NewKey << _T("\n");

Редактировать: LPCWSTR Notes

A LPCWSTR в Windows - это простой указатель на строку постоянной ширины или, точнее, const wchar_t *, что то же самое, что TCHAR * в проекте Unicode. Обратите внимание, что если вы изменили свой проект на набор символов MultiByte, то объявление функции RegGetValue() (и множество других функций Windows) изменится на использование LPCSTR вместо этого, а TCHAR будет просто char .

Преимущество использования std :: string / wstring в том, что они напрямую совместимы с LPCWSTR и LPCSTR. Таким образом, ваш вызов RegGetValue() может напрямую использовать переменные std :: wstring:

std::wstring BaseKey(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"));
std::wstring Value(_T("DisplayName"));
RegGetValue(HKEY_LOCAL_MACHINE, BaseKey, Value, ...).
0 голосов
/ 10 июня 2011

Я также попробовал что-то вроде:

wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)

Он скомпилируется, но затем при запуске происходит сбой.

Это потому, что вы пытаетесь объединитьчто-то в буквальную строку, так что лучшее, что произойдет, это то, что вы попираете случайные области вашего приложения.Я немного удивлен, что он компилируется без ошибок и предупреждений, так как литеральная строка будет константной ...?

http://msdn.microsoft.com/en-us/library/h1x0y282%28v=vs.80%29.aspx

0 голосов
/ 10 июня 2011

То, на что вы смотрите, это довольно простые манипуляции со строками. Что-то вроде:

std::string path("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
std::string achKey = get_key();

RegGetValueEx(HKEY_LOCAL_MACHINE, (path+achKey).c_str(), /* ... */);

Если вы используете широкие строки, вместо них вы хотите использовать wstring (и литералы широких символов):

std::wstring path(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");

std::wstring achKey = get_key(); // some function that gets the key you care about.

RegGetValueEx(HKEY_LOCAL_MACHINE, (path+achKey).c_str(), /* ... */);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...