Ок, это я исправил, но вот ведь работать нормально всеравно отказывается.Во первых, функция 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 просто "игнорируется". Т.е. как я и описывал в первом посте, никакие сообщения не срабатывают, при этом трассировка пробегает по коду, ключ не создается и программа закрывается в строчке (*)
Совсем не понятная для меня ситуация, граничащая с полтергейстом