Проблеммы с RegCreateKeyEx
От: Healer  
Дата: 27.02.06 17:11
Оценка:
Здравствуйте уважаемые.
Необходимо проверить создан ли ключь в реестре, либо просто открыт при выполнении функции RegCreateKeyEx. Для тестирования данного куска кода сделал консольное приложение.

Пр.1
var
  phKey: hKey;
  lpClass: PAnsiChar;
  lpdwDisposition: PDWORD;
  flag:boolean;
  rez:integer;
begin

RegCreateKeyEx(HKEY_CURRENT_USER, 'Software\TESTAPP',0,lpClass,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, nil,phKey,lpdwDisposition);
  
  if word(lpdwDisposition)=REG_CREATED_NEW_KEY then
    begin
      showmessage('Создан'+ inttostr(rez));
      flag:=true;
    end;
  if word(lpdwDisposition)=REG_OPENED_EXISTING_KEY then
    begin
      showmessage('Открыт '+ inttostr(rez));
      flag:=false;
    end;

end.


При этом ключ отказывает создаваться вообще. Заметил странную особенность, вот так вот ключ создается:

Пр.2
begin

RegCreateKeyEx(HKEY_CURRENT_USER, 'Software\TESTAPP',0,lpClass,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, nil,phKey,lpdwDisposition);
  
end.


Хотя принципиального отличия мой воспаленный мозг разглядеть не сумел. Может вы поможете?

ЗЫ: В примере 1 вообще никакие функции после RegCreateKeyEx не срабатывают, в том числе readln showmessage и т.п.
Re: Проблеммы с RegCreateKeyEx
От: awod Россия  
Дата: 27.02.06 20:35
Оценка:
Вы неправильно работаете с указателем.
Надо не word(lpdwDisposition), а просто lpdwDisposition^
С уважением AWOD.
Re[2]: Проблеммы с RegCreateKeyEx
От: Healer  
Дата: 28.02.06 16:54
Оценка:
Ок, это я исправил, но вот ведь работать нормально всеравно отказывается.Во первых, функция RegCreateKeyEx возвпащает 1, что как я понял значит ERROR_INVALID_FUNCTION. При этом все остальное, т.е. создание/открытие ключа и вывод соотвествующих сообщений, срабатывает нормально. НО всё это верно до тех пор пока закоментированны след. строки:


var
  phKey: hKey;
  a: word;
  lpClass: PAnsiChar;
  lpdwDisposition: PDWORD;
  flag:boolean;
  rez:integer;
begin
//HSEnablePrivilege('SERESTOREPRIVILEGE');
 // HSEnablePrivilege('SEBACKUPPRIVILEGE');
  RegCreateKeyEx(HKEY_CURRENT_USER, 'Software\TESTAPP',0,lpClass, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS    ,nil,phKey,lpdwDisposition);
  if lpdwDisposition^=REG_CREATED_NEW_KEY then
    begin
      showmessage('Ñîçäàí '+ inttostr(rez));
      flag:=true;
    end;
  if lpdwDisposition^=REG_OPENED_EXISTING_KEY then
    begin
      showmessage('Îòêðûò '+ inttostr(rez)); (*)
      flag:=false;
    end;
end;



где закоментированная функция HSEnablePrivilege выглядит следующим образом:


function HSEnablePrivilege(const PrivilegeName: String): Boolean;
var
 LUID: TLargeInteger;
 Priv: TTokenPrivileges;
 AccessToken: THandle;
 ReturnLen: Cardinal;
 i:integer;
begin
 Result := OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,AccessToken);
 if not Result then
      Exit;
 Result := LookupPrivilegeValueA(nil, PChar(PrivilegeName), LUID);
 if not Result then
      Exit;
 Priv.PrivilegeCount := 1;
 Priv.Privileges[0].Luid := LUID;
 Priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 Result := AdjustTokenPrivileges(AccessToken, false, Priv,
           SizeOf(TTokenPrivileges), nil, ReturnLen);
 i:=1;
end;


Установка соотвествующих привелегий процессу нужна для другой части работы. Если убрать комментарии и дать функциям выполниться часть программы после RegCreateKeyEx просто "игнорируется". Т.е. как я и описывал в первом посте, никакие сообщения не срабатывают, при этом трассировка пробегает по коду, ключ не создается и программа закрывается в строчке (*)
Совсем не понятная для меня ситуация, граничащая с полтергейстом
Re[2]: Проблеммы с RegCreateKeyEx
От: Healer  
Дата: 28.02.06 17:44
Оценка:
А вообще говоря, изначально я работал с указателем именно так как Вы сказали. Но методом проб и ошибок выяснилось, что именно этото кучочек кода вызывает вылет программы и посыл к разработчику. Причем в функцию программа заходит неоднократно, открывается около 100 ключей, затем (условно на 101 ключе) прога вылетает. Если же закоментировать строки с lpdwDisposition^, либо обращаться подобным образом dword(lpdwDisposition), все выполняется верно. Хотя признаю, что смысла, в том как я работал с указателем, нет, очевидно что ошибка кроется именно здесь.
Re[2]: Проблеммы с RegCreateKeyEx
От: Healer  
Дата: 01.03.06 17:42
Оценка:
апну тему, мб кто сталкивался с подобными глюками?
Re: Проблеммы с RegCreateKeyEx
От: Аноним  
Дата: 01.03.06 18:39
Оценка:
Здравствуйте, Healer, Вы писали:

H>
H>var
H>  phKey: hKey;
H>  lpClass: PAnsiChar;
H>  lpdwDisposition: PDWORD;
H>  flag:boolean;
H>  rez:integer;
H>begin

H>RegCreateKeyEx(HKEY_CURRENT_USER, 'Software\TESTAPP',0,lpClass,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, nil,phKey,lpdwDisposition);
  
H>  if word(lpdwDisposition)=REG_CREATED_NEW_KEY then
H>    begin
H>      showmessage('Создан'+ inttostr(rez));
H>      flag:=true;
H>    end;
H>  if word(lpdwDisposition)=REG_OPENED_EXISTING_KEY then
H>    begin
H>      showmessage('Открыт '+ inttostr(rez));
H>      flag:=false;
H>    end;

H>end.
H>


Не вижу инициализации указателей phKey и lpdwDisposition. Они должны указывать на область памяти (переменную), в которую будет записан результат. Если они указывают непонятно-куда, то результат выполнения может быть непредсказуем. В том числе и исключение при обращении по несуществующему адресу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.