Здравствуйте уважаемые.
Необходимо проверить создан ли ключь в реестре, либо просто открыт при выполнении функции 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 и т.п.
Вы неправильно работаете с указателем.
Надо не word(lpdwDisposition), а просто lpdwDisposition^
Ок, это я исправил, но вот ведь работать нормально всеравно отказывается.Во первых, функция 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 просто "игнорируется". Т.е. как я и описывал в первом посте, никакие сообщения не срабатывают, при этом трассировка пробегает по коду, ключ не создается и программа закрывается в строчке (*)
Совсем не понятная для меня ситуация, граничащая с полтергейстом
А вообще говоря, изначально я работал с указателем именно так как Вы сказали. Но методом проб и ошибок выяснилось, что именно этото кучочек кода вызывает вылет программы и посыл к разработчику. Причем в функцию программа заходит неоднократно, открывается около 100 ключей, затем (условно на 101 ключе) прога вылетает. Если же закоментировать строки с lpdwDisposition^, либо обращаться подобным образом dword(lpdwDisposition), все выполняется верно. Хотя признаю, что смысла, в том как я работал с указателем, нет, очевидно что ошибка кроется именно здесь.
Здравствуйте, 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. Они должны указывать на область памяти (переменную), в которую будет записан результат. Если они указывают непонятно-куда, то результат выполнения может быть непредсказуем. В том числе и исключение при обращении по несуществующему адресу.