Ошибка с RegOpenKeyEx
От: Serg Phantom  
Дата: 21.02.07 13:09
Оценка:
Доброго всем!
Код:
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
  HKEY LocalServer = 0;
  DWORD Status = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", KEY_QUERY_VALUE, 0, &LocalServer);
  ...
}

По итогам выполнения — Status = 5 (отказано в доступе).
Пишу на С++ Builder 5 SP1. Код помещен в DllMain исключительно для примера. Он не работает при вызове из любой функции dll. Так же он не работает при вызове из другого проекта (exe, работающий с этой dll).
ЕСТЕСТВЕННО, все права на ключик есть (я локальный админ на машине). Тут же рядом пускаю Delphi, пишу TRegistry.Create, OpenKey(...) — все отлично проходит... Причем, как следует из кода TRegistry — с доступом REG_ALL_ACCESS. regedit тоже отлично все открывает.
Что же я не так делаю в билдере?
С уважением, Сергей.
Re: Ошибка с RegOpenKeyEx
От: Lonely Dog Россия  
Дата: 21.02.07 13:12
Оценка:
Здравствуйте, Serg Phantom, Вы писали:

SP>Доброго всем!

SP>Код:
SP>
SP>BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
SP>{
SP>  HKEY LocalServer = 0;
SP>  DWORD Status = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", KEY_QUERY_VALUE, 0, &LocalServer);
SP>  ...
SP>}
SP>

...
SP>Что же я не так делаю в билдере?
Смотрим прототип функции RegOpenKeyEx:
LONG RegOpenKeyEx(
  HKEY hKey,
  LPCTSTR lpSubKey,
  DWORD ulOptions,
  REGSAM samDesired,
  PHKEY phkResult
);

Видим, что у вас в коде перепутаны параметры ulOptions и samDesired. Думаю, что вот так все будет работать:
DWORD Status = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_QUERY_VALUE, &LocalServer);
Re[2]: Ошибка с RegOpenKeyEx
От: Serg Phantom  
Дата: 21.02.07 13:20
Оценка: :)
Здравствуйте, Lonely Dog, Вы писали:

LD>Видим, что у вас в коде перепутаны параметры ulOptions и samDesired. Думаю, что вот так все будет работать:


ЭТО Ж НАДО ТАК ОБЛАЖАТЬСЯ!!! Спасибо огромное!!! Глаз замылился... Пора, видимо, отвлечься
С уважением, Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.