Re[2]: SetupDiOpenDevRegKey не работает
От: Alexey Frolov Беларусь  
Дата: 10.04.09 13:34
Оценка: +1
Здравствуйте, Unhandled_Exception, Вы писали:

U_E>а чем тебе значение не понравилось?


Согласен, вполне себе валидное значение

U_E>ничего не естественно. что за ошибка, что GetLastError() говорит?


GetLastError ничего не скажет

If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.

RegQueryValueEx сама возвращает значение ошибки, вот его и надо смотреть

U_E>думаю, что access violation, попробуй добавить прав (KEY_*).


Возможно вы имели ввиду Access denied (5). Скорее всего так и есть, только вот добавить прав с помощью KEY_* не поможет, для RegQueryValueEx больше чем KEY_READ и не надо. Если нет доступа, то значит его нет. Нужна либо более привилегированая учетная запись, под которой выполняется код, либо в security descriptor ключа надо добавить прав доступа для этой записи. Думаю что первый вариант будет более предпочтителен, просто запускать код из под другого аккаунта
SetupDiOpenDevRegKey не работает
От: Vladi_2K7  
Дата: 10.04.09 09:05
Оценка:
Уважаемые форумчане, подскажите, почему функция SetupDiOpenDevRegKey возвращает значение (к примеру) HKEY = 0x00000f54 {unused = ???}, но при проверке на ошибку все прокатывает. Соответственно, при использовании полученного значения в функции RegQueryValueEx, она мне выдает ошибку. В дополнение к сказанному привожу свой код:

// Получить класс сетевых устройств
HDEVINFO hDeviceInfoSet = SetupDiGetClassDevs(
    &GUID_DEVCLASS_NET,    // GUID сетевых устройств
    NULL,
    NULL,
    DIGCF_PRESENT);        // Устройства, в настоящее время присутствующие в системе
if (hDeviceInfoSet == INVALID_HANDLE_VALUE)
{
    TRACE(_T("\n\tSetupDiGetClassDevs failed.\n"));
    return FALSE;
}

SP_DEVINFO_DATA DeviceInfoData;

// Подготавливаем структуру для получения информации об устройстве
memset(&DeviceInfoData, 0, sizeof(SP_DEVINFO_DATA));
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

DWORD dwDeviceIndex = 0;    // Номер устройства

// Перечислить все сетевые устройства
while (SetupDiEnumDeviceInfo(
    hDeviceInfoSet,
    dwDeviceIndex,
    &DeviceInfoData))
{
    WCHAR szDeviceDescription[255];
    DWORD dwDeviceDescriptionSize = (DWORD) (sizeof(szDeviceDescription) / sizeof(szDeviceDescription[0]));

    BOOL bResult = SetupDiGetDeviceRegistryProperty(
        hDeviceInfoSet,
        &DeviceInfoData,
        SPDRP_DEVICEDESC,
        NULL,
        (PBYTE) szDeviceDescription,
        dwDeviceDescriptionSize,
        &dwDeviceDescriptionSize);
    if (!bResult)
    {
        TRACE(_T("\n\tSetupDiGetDeviceRegistryProperty failed.\n"));
        break;
    }
        
    HKEY hDeviceKey = SetupDiOpenDevRegKey(
        hDeviceInfoSet,
        &DeviceInfoData,
        DICS_FLAG_GLOBAL,
        0,
        DIREG_DEV,
        KEY_READ);
!!!! -> После выполнения этого кода и появляется в отладчике значени 0x00000f54 {unused=???}
!!!! -> Естественно, после вызова, функция RegQueryValueEx выдает ошибку
    if (hDeviceKey == INVALID_HANDLE_VALUE)
    {
        TRACE(_T("\n\tSetupDiOpenDevRegKey failed.\n"));
        break;
    }

    WCHAR szBuffer[80];
    DWORD dwBufferSize = (DWORD) (sizeof(szBuffer) / sizeof(szBuffer[0]));

    if (RegQueryValueEx(hDeviceKey, _T("InfPath"), NULL, NULL, (LPBYTE) szBuffer, &dwBufferSize) == ERROR_SUCCESS)
    {
            ...
    }

    RegCloseKey(hDeviceKey);

    dwDeviceIndex++;
}
    
SetupDiDestroyDeviceInfoList(hDeviceInfoSet);


Что я делаю не так?

Заранее большое спасибо!!!
visual studio c++
Re: SetupDiOpenDevRegKey не работает
От: Unhandled_Exception Россия  
Дата: 10.04.09 11:12
Оценка:
Здравствуйте, Vladi_2K7, Вы писали:

V_K>Уважаемые форумчане, подскажите, почему функция SetupDiOpenDevRegKey возвращает значение (к примеру) HKEY = 0x00000f54 {unused = ???}, но при проверке на ошибку все прокатывает.


а чем тебе значение не понравилось?

V_K>!!!! -> После выполнения этого кода и появляется в отладчике значени 0x00000f54 {unused=???}

V_K>!!!! -> Естественно, после вызова, функция RegQueryValueEx выдает ошибку
V_K> if (hDeviceKey == INVALID_HANDLE_VALUE)
V_K> {
V_K> TRACE(_T("\n\tSetupDiOpenDevRegKey failed.\n"));
V_K> break;
V_K> }

ничего не естественно. что за ошибка, что GetLastError() говорит?
думаю, что access violation, попробуй добавить прав (KEY_*).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.