代码之家  ›  专栏  ›  技术社区  ›  Vegar

绝地WSCL中的RangeCheckError

  •  2
  • Vegar  · 技术社区  · 15 年前

    我在用 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;
    

    它看起来像是来自jwsecurityid.createCopyOfSid()函数,但我不知道为什么。

    有人知道什么线索吗?

    我使用的是Delphi2007,btw,而wscl代码是最新的sourceforge代码。

    当做,
    -维加尔

    1 回复  |  直到 15 年前
        1
  •  9
  •   ChristianWimmer    15 年前

    原因是PSID结构的声明。它有一个叫次权威的成员 定义如下:

    子权限:dword的数组[0..anySize_array-1]

    anySize_数组是一个设置为1的常量,因此数组的范围是0到0。 这是一个转换为delphi的C构造,但delphi不知道。通过分配足够的空间来允许数组中不止一个DWORD,可以安全地创建结构。

    如果在Delphi中使用带有激活范围检查错误的变量C结构,则此异常非常常见。

    但是,作为一种解决方案,您可以通过打开jwscl.inc文件并添加$R-来关闭jwscl的开关。 afaik开关仅持续到每个单元的末尾,然后使用默认值。inc文件包含在每个单独的jwscl文件中。