我正在使用JEDI WSCL在安装期间更改文件夹的权限.在没有优化的情况下进行编译,并且使用范围检查时,我在设置新的访问控制列表时会进行范围检查.
procedure SetFilePermissions(const folder: string);
var
FileObject: TJwSecureFileObject;
DACL: TJwDAccessControlList;
begin
FileObject := TJwSecureFileObject.Create(folder);
try
DACL := FileObject.DACL;
JwInitWellknownSIDs;
DACL.Add(TJwDiscretionaryAccessControlEntryAllow.Create(nil, [afObjectInheritAce], GENERIC_ALL, JwWorldSID, false));
FileObject.SetDACL(DACL);
finally
FileObject.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
看起来它来自JwsclSid.pas中的函数TJwSecurityId.CreateCopyOfSID(),但我找不到原因.
有人有任何线索吗?
我正在使用Delphi 2007,顺便说一下,wscl代码是sourceforge的最新代码.
问候,
-Vegar
原因是PSID结构的声明.它有一个名为SubAuthority的memeber,定义如下:
SubAuthority:DWORD的数组[0..ANYSIZE_ARRAY - 1];
ANYSIZE_ARRAY是一个设置为1的常量,因此数组的范围是0到0.这是ac构造转换为Delphi但Delphi不知道它.通过分配足够的空间以允许阵列中只有一个DWORD来安全地创建结构.
如果您在Delphi中使用带有激活范围检查错误的变量c结构,则会发生此异常.
但是,作为解决方案,您可以通过打开jwscl.inc文件并添加{$ R-}来关闭JWSCL的开关.AFAIK开关仅持续到每个单元的末尾,然后使用默认值.inc文件包含在每个jwscl文件中.