Пытаясь найти путь к совершенству с помощью поиска в реестре - PullRequest
1 голос
/ 06 февраля 2012

Я пытаюсь найти путь к Excel, используя реестр, и попытался адаптировать некоторый код, который я нашел в Интернете.Я использую 64-битную Win7 и подтвердил, что ключ используется regedit.

#include <windows.h>

#include <iomanip>
#include <iostream>

using namespace std;

int main()
{
HKEY hKey = 0;
char buf[255] = {0};
DWORD dwType = 0;
DWORD dwBufSize = sizeof(buf);
const char* subkey = "SOFTWARE\\Classes\\Excel.Application\\CLSID";

if( RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey) == ERROR_SUCCESS)
{
    dwType = REG_SZ;
    if( RegQueryValueEx(hKey,"default",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)
    {
        cout << "key value is '" << buf << "'\n";
    }
    else
        cout << "can not query for key value\n";
    RegCloseKey(hKey);

}
else
    cout << "Can not open key\n";
cin.ignore();

return 0;
}

Кто-нибудь знает, почему это не работает?Спасибо Джеймс

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Попробуйте изменить

RegQueryValueEx(hKey,"default",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)

на

RegQueryValueEx(hKey, NULL, 0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)

Если вы хотите значение «по умолчанию», вы должны передать NULL или пустую строку в поле lpValueName.

Кроме того, если ваше приложение не является 64-битным, и вы работаете в 64-битной ОС, вы должны проверить флаг KEY_WOW64_64KEY в функции RegOpenKeyEx, чтобы иметь доступ к нужному ключу.

1 голос
/ 06 февраля 2012

Почти все функции Windows API при сбое устанавливают более подробный код ошибки, который вы можете получить, вызвав GetLastError() для получения более подробной информации.Вы должны вызывать это после сбоя вызова RegOpenKey().

В вашем примере RegOpenKey(), вероятно, завершается с ошибкой отказа в доступе.RegOpenKey() открыть раздел реестра с полным доступом для чтения / записи / удаления.Обычный пользователь в Windows 7 не имеет доступа на запись или удаление в HKLM, поэтому RegOpenKey() завершится ошибкой.

Вместо этого следует использовать RegOpenKeyEx () , что позволит указать только для чтениядоступ, как показано ниже.

RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_READ, &hKey)

PS.Задавая вопрос, подобный приведенному выше, вы должны более подробно описать, как происходит сбой кода.В приведенном выше примере вы должны указать, какой вызов строки / функции не удался.Например, «Когда я использую этот код, вызов RegOpenKey не выполняется.

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