| Автор
| Сообщение |
 Lev
Новичок

Возраст: 44
Знак зодиака: 
Зарегистрирован: 05.09.2006
Сообщения: 3
Откуда: Пермь
|
|
|
Цитата |
|
Возникла проблема с вызовом функции GetEffectiveRightsFromAcl. На ее вызове получаю от Windows сообщение: Access violation at address 77E833C3 in module RPCRT4.DLL. Read of address 88009C4D. Посоветуйте, кто что может.
Вот код, вызвавший ошибку:
-----------------------------------------------------------------------------------------------------
| delphi: | function TSelectSetupDirFrm.DefUsrSetupAbilities: boolean; var DirAcl: _ACL; SecurityDescriptor: pointer; UsrName: string; UsrSid: pointer; UsrTrustee: _TRUSTEE_A; AccessRights: cardinal; begin SecurityDescriptor := nil; Result := false; if GetNamedSecurityInfo(PChar(FolderField.Text), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, @DirAcl, nil, SecurityDescriptor) = ERROR_SUCCESS then begin UsrName := DefUsrName; UsrSid := DefUsrSid(UsrName); if UsrSid <> nil then begin UsrTrustee.pMultipleTrustee := nil; UsrTrustee.MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE; UsrTrustee.TrusteeForm := TRUSTEE_IS_SID; UsrTrustee.TrusteeType := TRUSTEE_IS_USER; UsrTrustee.ptstrName := UsrSid; //Ошибка выходит здесь if GetEffectiveRightsFromAcl(DirAcl, UsrTrustee, AccessRights) = ERROR_SUCCESS then begin Result := (AccessRights >= GENERIC_ALL); end; FreeMem(UsrSid); end; end; if SecurityDescriptor <> nil then LocalFree(HLOCAL(SecurityDescriptor)); end;
|
|
|
| В начало |
|
 |
|
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
AccessRights - не cardinal, а pointer на 4-байтовое целое _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 Lev
Новичок

Возраст: 44
Знак зодиака: 
Зарегистрирован: 05.09.2006
Сообщения: 3
Откуда: Пермь
|
|
|
Цитата |
|
| DrPass писал(а): | | AccessRights - не cardinal, а pointer на 4-байтовое целое |
Это в API он pointer, а в Дельфи он cardinal, передаваемый в функцию через var. Я конечно попробовал, но получил по голове от компилятора.
Но дело уже не в этом. Помучав (или помучив) свой код еще некоторое время, я пришел к другой ошибке на том же самом вызове.
| delphi: | function TSelectSetupDirFrm.DefUsrSetupAbilities: boolean; var ...; AclPtr: PACL; begin ...; if AclPtr = nil then begin ShowMessage('AclPtr = nil'); Result := false; Exit; end; if not IsValidAcl(AclPtr^) then begin ShowMessage('ACL not valid'); Result := false; Exit; end; ...; if GetEffectiveRightsFromAcl(AclPtr^, UsrTrustee, AccessRights) = ERROR_SUCCESS then begin Result := (AccessRights >= GENERIC_ALL); end else Result := false; ...; end;
|
На этот раз она звучит так: "Access violation at address ... in module ntdll.dll. Read of address 00000000". Почитал я про подобные ошибки в интернете и тошно стало. Сообщают о ней все кому не лень, а решений 0. Неужели это конец? |
|
| В начало |
|
 |
 Lev
Новичок

Возраст: 44
Знак зодиака: 
Зарегистрирован: 05.09.2006
Сообщения: 3
Откуда: Пермь
|
|
|
Цитата |
|
Проблему решил. Оказалось, что нельзя структуру TRUSTEE инициализировать напрямую. Вместо этого нужно пользоваться функциями BuildTrusteeWith...
Всем спасибо. |
|
| В начало |
|
 |
|