Здравствуйте, 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 возвращает значение (к примеру) 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);
Что я делаю не так?
Заранее большое спасибо!!!