Чтение значения из реестра C ++ - PullRequest
5 голосов
/ 13 июня 2011

Я хочу получить путь к месту установки приложения. В реестре есть запись, в которой указан путь к моему приложению, см. Этот снимок экрана: http://i56.tinypic.com/2ly1l6s.jpg

Я хочу прочитать путь, где находится мое приложение. Другими словами, я хочу часть C: \ Projects \ MyApplication \ MyApplication.exe. Вот что я пытаюсь сделать:

HKEY hKey;
wchar_t mydata[2048];
DWORD dataLength = sizeof(mydata);
DWORD dwType = REG_SZ;
LPVOID messagecaliss;
LONG regOpenCriss = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", 0, KEY_QUERY_VALUE, &hKey);
GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, GetLastError(), NULL,(LPTSTR) &messagecaliss, 0, NULL );
if (regOpenCriss == ERROR_SUCCESS) {
RegQueryValueEx(HKEY_CURRENT_USER, "TestApplication", 0, &dwType, (BYTE*)mydata, &dataLength);
wprintf(L"%s\n", mydata);
system("PAUSE");
}
else
    MessageBox(NULL,(LPCTSTR)messagecaliss,"ERROR",MB_OK|MB_ICONINFORMATION);

Это не работает, ненужные символы печатаются. Большое спасибо.

Ответы [ 4 ]

5 голосов
/ 13 июня 2011

вы используете не-UNICODE версию o RegQueryValueEx и вы используете его для широкоформатной версии printf.Используйте либо printf, либо измените wprintf (L "% S", mydata)

Примечание: RegQueryValueEx (HKEY_CURRENT_USER, ...) должно быть RegQueryValueEx (hKey, ...)

1 голос
/ 13 июня 2011

Это не работает

Откуда вы знаете, что без проверки возвращаемого значения RegQueryValueEx?

печатаются ненужные символы

Нет. Это не мусор. Вы не просили строку широких символов, поэтому вы не можете ожидать ее получения. Скомпилируйте с включенным Юникодом и вызовите RegQueryValueEx с L"TestApplication" или _T("TestApplication") или TEXT("TestApplication"). RegQueryValueEx - это просто определение типа для RegQueryValueExA или RegQueryValueExW, в зависимости от того, определен ли Unicode во время компиляции или нет.

Большое спасибо

Не за что.

1 голос
/ 13 июня 2011

Я получил результаты после:

  1. Я окружаю строки _T ()
  2. Я вызываю RegQueryValueEx с hKey в качестве первого параметра

Вы должны сохранить результат RegQueryValueEx в переменной и проверить его.Обрабатывать случай отказа ...

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

Основная проблема с кодом, который вы представляете, заключается в том, что у вас есть приведения в стиле C.Каждый актер является аттрактором ошибок.И на самом деле, некоторые ваши приведения являются ошибками (скрывая, что вы используете несовместимые типы символов).

Я хочу прочитать путь, где находится мое приложение.

Использование GetModuleFileName.

Документы MSDN :
Извлекает полный путь

Приветствия и hth.,

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