2009-12-16 12 views
2

我正在使用JEDI WSCL在安裝期間更改文件夾的權限。 在沒有優化的情況下編譯時,使用範圍檢查時,在設置新的訪問控制列表時,我會得到一個範圍檢查。JEDI中的RangeCheckError 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; 

它lookes喜歡它來自於JwsclSid.pas功能TJwSecurityId.CreateCopyOfSID(),但我不能找出原因。

有沒有人有任何線索?

我使用的是Delphi 2007,順便說一句,wscl代碼是sourceforge的最新版本。

問候,
-Vegar

回答

9

原因是PSID結構的聲明。它有一個名爲SubAuthority 的memeber,定義如下:

DWORD的SubAuthority:array [0..ANYSIZE_ARRAY - 1];

ANYSIZE_ARRAY是一個常量,它被設置爲1,因此數組的範圍爲0到0. 這是一個轉換爲Delphi的c構造,但Delphi並不知道它。該結構是通過分配足夠的空間來安全地創建的,以便在數組中允許多個DWORD。

如果您在Delphi中使用變量c結構並激活了範圍檢查錯誤,則此異常會經常發生。

但是,作爲解決方案,您可以通過打開jwscl.inc文件並添加{$ R-}來關閉JWSCL的開關。 AFAIK開關僅持續到每個單元的末端,然後使用默認值。 inc文件包含在每個jwscl文件中。

+0

哇!不確定任何人會有答案,但隨後彈出,快速和準確。謝謝! – Vegar 2009-12-16 17:11:34

+0

也許是因爲wimmer是JWSCL的維護者;) – Runner 2009-12-16 20:26:13

+0

這個維護者在這裏(我是另一個)並不是很棒;如果你不知道「Jedi Windows安全庫」,請檢查它出來了! – Remko 2009-12-17 07:09:45