Example #1
0
        /// <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);
        }
Example #2
0
        /// <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;
            }));
        }
Example #3
0
 /// <inheritdoc />
 /// <summary>
 /// 注册表键信息类复制构造函数。
 /// </summary>
 /// <param name="regKey">
 /// 注册表键信息类。
 /// </param>
 public RegKey(RegKey regKey) :
     base(regKey.HKey, regKey.LpSubKey, regKey.LpValueName)
 {
     LpKind  = regKey.LpKind;
     LpValue = regKey.LpValue;
 }