/// <summary> /// 获取注册表键信息。 /// </summary> /// <exception cref="Exception"> /// 非托管代码获取注册表时产生的异常,详情请参阅MSDN。 /// </exception> /// <returns> /// 注册表键信息。 /// </returns> public async Task <RegKey> Get() { RegKey regkey; try { var phkresult = await RegOpenKey(); var lpcbData = 0; NativeMethods.RegQueryValueEx(phkresult, LpValueName, IntPtr.Zero, out var lpkind, IntPtr.Zero, ref lpcbData); if (lpcbData == 0) { NativeMethods.RegCloseKey(phkresult); throw new Exception(@"注册表访问失败" + '\n' + @"无法获取缓冲区大小" + '\n' + nameof(Get)); } var lpdata = Marshal.AllocHGlobal(lpcbData); var reggetvaluetemp = NativeMethods.RegQueryValueEx(phkresult, LpValueName, IntPtr.Zero, out lpkind, lpdata, ref lpcbData); if (reggetvaluetemp != (int)ERROR_CODE.ERROR_SUCCESS) { throw new Exception(@"注册表访问失败" + '\n' + reggetvaluetemp + '\n' + nameof(Get)); } NativeMethods.RegCloseKey(phkresult); if (reggetvaluetemp != (int)ERROR_CODE.ERROR_SUCCESS) { throw new Exception(@"注册表访问失败" + '\n' + reggetvaluetemp + '\n' + nameof(Get)); } regkey = await ConvertData((REG_KEY_TYPE)lpkind, lpdata, lpcbData); } catch (Exception) { regkey = new RegKey(this); } return(regkey); }
/// <summary> /// 转换注册表所需数据。 /// </summary> /// <param name="lpKind"> /// 注册表键值类型。 /// </param> /// <param name="lpData"> /// 注册表键值。 /// </param> /// <param name="lpcbData"> /// 注册表键值所需内存。 /// </param> /// <returns> /// 转换为已封装数据。 /// </returns> protected Task <RegKey> ConvertData(REG_KEY_TYPE lpKind, IntPtr lpData, int lpcbData) { return(Task.Run(() => { RegKey regkey; if (lpKind == REG_KEY_TYPE.REG_DWORD) { var lpdataint = Marshal.ReadInt32(lpData); regkey = new RegKey(this, lpKind, lpdataint); } else if (lpKind == REG_KEY_TYPE.REG_QWORD) { var lpdataint = Marshal.ReadInt64(lpData); regkey = new RegKey(this, lpKind, lpdataint); } else if (lpKind == REG_KEY_TYPE.REG_SZ || lpKind == REG_KEY_TYPE.REG_EXPAND_SZ || lpKind == REG_KEY_TYPE.REG_MULTI_SZ) { var lpdatastr = Marshal.PtrToStringUni(lpData); lpdatastr = lpdatastr?.Trim(); regkey = new RegKey(this, lpKind, lpdatastr); } else if (lpKind == REG_KEY_TYPE.REG_BINARY) { var lpdatabin = new byte[lpcbData]; Marshal.Copy(lpData, lpdatabin, 0, lpcbData); regkey = new RegKey(this, lpKind, lpdatabin); } else { throw new Exception(@"注册表访问失败" + '\n' + @"注册表数据类型异常" + '\n' + nameof(ConvertData)); } return regkey; })); }
/// <inheritdoc /> /// <summary> /// 注册表键信息类复制构造函数。 /// </summary> /// <param name="regKey"> /// 注册表键信息类。 /// </param> public RegKey(RegKey regKey) : base(regKey.HKey, regKey.LpSubKey, regKey.LpValueName) { LpKind = regKey.LpKind; LpValue = regKey.LpValue; }