2010-06-17 34 views
7

根據我在文檔中的理解,如果失敗,它將返回null,但在我看來,每個失敗場景都有一個異常。Registry.CreateSubKey何時返回null?

在什麼標準的情況下,這個函數實際上會返回一個空值?

+0

怪異。如果您真的好奇,請下載Reflector,找到此方法並查看它是否/何時返回null。可能是因爲底層的系統調用失敗...... – Grzenio 2010-06-17 10:37:30

+1

好主意.. 按照這個方法很複雜,但它完成了以下兩行: BCLDebug.Assert(false,「RegistryKey中的意外代碼路徑: :CreateSubKey「); 返回null; 所以我想沒有「正常」的調用應該導致null。 resharper只是沒有看到它,並警告空返回值。我會安全地忽略它。 – 2010-06-17 10:41:19

回答

1

如果你看看通過反射器的代碼,你會看到,如果從本地方法Win32Native.RegCreateKeyEx()返回以外的任何其他的錯誤代碼0或者返回如果操作的結果是null,它就會返回null回給你。

這裏可能的失敗是,如果使用不正確的權限,導致返回訪問被拒絕的錯誤代碼。

此方法背後的代碼如下:確實

[ComVisible(false)] 
public unsafe RegistryKey CreateSubKey(string subkey, RegistryKeyPermissionCheck permissionCheck, RegistrySecurity registrySecurity) 
{ 
    ValidateKeyName(subkey); 
    ValidateKeyMode(permissionCheck); 
    this.EnsureWriteable(); 
    subkey = FixupName(subkey); 
    if (!this.remoteKey) 
    { 
     RegistryKey key = this.InternalOpenSubKey(subkey, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree); 
     if (key != null) 
     { 
      this.CheckSubKeyWritePermission(subkey); 
      this.CheckSubTreePermission(subkey, permissionCheck); 
      key.checkMode = permissionCheck; 
      return key; 
     } 
    } 
    this.CheckSubKeyCreatePermission(subkey); 
    Win32Native.SECURITY_ATTRIBUTES structure = null; 
    if (registrySecurity != null) 
    { 
     structure = new Win32Native.SECURITY_ATTRIBUTES(); 
     structure.nLength = Marshal.SizeOf(structure); 
     byte[] securityDescriptorBinaryForm = registrySecurity.GetSecurityDescriptorBinaryForm(); 
     byte* pDest = stackalloc byte[1 * securityDescriptorBinaryForm.Length]; 
     Buffer.memcpy(securityDescriptorBinaryForm, 0, pDest, 0, securityDescriptorBinaryForm.Length); 
     structure.pSecurityDescriptor = pDest; 
    } 
    int lpdwDisposition = 0; 
    SafeRegistryHandle hkResult = null; 
    int errorCode = Win32Native.RegCreateKeyEx(this.hkey, subkey, 0, null, 0, GetRegistryKeyAccess(permissionCheck != RegistryKeyPermissionCheck.ReadSubTree), structure, out hkResult, out lpdwDisposition); 
    if ((errorCode == 0) && !hkResult.IsInvalid) 
    { 
     RegistryKey key2 = new RegistryKey(hkResult, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree, false, this.remoteKey, false); 
     this.CheckSubTreePermission(subkey, permissionCheck); 
     key2.checkMode = permissionCheck; 
     if (subkey.Length == 0) 
     { 
      key2.keyName = this.keyName; 
      return key2; 
     } 
     key2.keyName = this.keyName + @"\" + subkey; 
     return key2; 
    } 
    if (errorCode != 0) 
    { 
     this.Win32Error(errorCode, this.keyName + @"\" + subkey); 
    } 
    return null; 
}