如何正确处理来自Winreg板条箱的Regvaule类型?

时间:2020-01-08 12:02:15

标签: rust registry

我陷入了以下问题。为了正确保存某些regvalue,我需要知道它是哪种regvalue。字符串或整数。

目前我的代码不是很可重用,因为我需要提前知道它是哪种正值。

获得一些更好的技巧的提示将非常有帮助。

extern crate winreg;

use winreg::enums::{HKEY_LOCAL_MACHINE, KEY_READ};
use std::fs::File;
use std::io::prelude::*;

fn regreadvalue_string (regpath: &str, regvalue: &str, mut inifile: &std::fs::File) {
    let hklm = winreg::RegKey::predef(HKEY_LOCAL_MACHINE);

    let subkey = hklm.open_subkey_with_flags(regpath, KEY_READ);

    match subkey {
        Ok(subkey) => {
            let thevalue: String = subkey.get_value(regvalue).unwrap_or_default();
            let iniline: String = format!("{}\\{}={}\n", regpath, regvalue, thevalue);
            let binaryiniline = iniline.as_bytes();
            inifile.write_all(binaryiniline).expect("could not write line");
            },
        Err(_error) => {
            let iniline: String = format!("{}\\{}={}\n", regpath, regvalue, "");
            let binaryiniline = iniline.as_bytes();
            inifile.write_all(binaryiniline).expect("could not write line");
            },
        };
    }
fn regreadvalue_int (regpath: &str, regvalue: &str, mut inifile: &std::fs::File) {
        let hklm = winreg::RegKey::predef(HKEY_LOCAL_MACHINE);

        let subkey = hklm.open_subkey_with_flags(regpath, KEY_READ);

        match subkey {
            Ok(subkey) => {
                let thevalue: u32 = subkey.get_value(regvalue).unwrap_or_default();
                let iniline: String = format!("{}\\{}={}\n", regpath, regvalue, thevalue);
                let binaryiniline = iniline.as_bytes();
                inifile.write_all(binaryiniline).expect("could not write line");
                },
            Err(_error) => {
                let iniline: String = format!("{}\\{}={}\n", regpath, regvalue, "");
                let binaryiniline = iniline.as_bytes();
                inifile.write_all(binaryiniline).expect("could not write line");
                },
            };
        }


fn main() -> std::io::Result<()> {

    let mut inifile = File::create("output.ini")?;
    inifile.write_all(b"[FileInfo]\n")?;
    inifile.write_all(b"Version=1\n")?;
    inifile.write_all(b"[Machine]\n")?;
    regreadvalue_string(r#"SOFTWARE\Microsoft\Windows NT\CurrentVersion"#, "ProductName", &inifile);
    regreadvalue_string(r#"SOFTWARE\Microsoft\Windows NT\CurrentVersion"#, "CurrentVersion", &inifile);
    regreadvalue_string(r#"SOFTWARE\Microsoft\Windows NT\CurrentVersion"#, "EditionID", &inifile);
    regreadvalue_string(r#"SOFTWARE\Microsoft\Windows NT\CurrentVersion"#, "ReleaseId", &inifile);
    regreadvalue_string(r#"SOFTWARE\Microsoft\Cryptography"#, "MachineGuid", &inifile);
    regreadvalue_string(r#"SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName"#, "ComputerName", &inifile);
    regreadvalue_string(r#"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"#, "Domain", &inifile);
    regreadvalue_string(r#"SYSTEM\ControlSet001\Control\SystemInformation"#, "ComputerHardwareId", &inifile);
    regreadvalue_string(r#"SYSTEM\ControlSet001\Control\SystemInformation"#, "SystemManufacturer", &inifile);
    regreadvalue_string(r#"SYSTEM\ControlSet001\Control\SystemInformation"#, "SystemProductName", &inifile);
    regreadvalue_string(r#"SYSTEM\ControlSet001\Control\SystemInformation"#, "BIOSVersion", &inifile);
    regreadvalue_string(r#"SYSTEM\ControlSet001\Control\SystemInformation"#, "BIOSReleaseDate", &inifile);
    regreadvalue_int(r#"SYSTEM\HardwareConfig\Current"#, "EnclosureType", &inifile);

    Ok(())
}

1 个答案:

答案 0 :(得分:0)

您可以使用context API来获取原始注册表值,并根据其类型自行设置其格式:

GKGameCenterViewController

请注意,我不使用Windows。因此,代码可能会有小错误,但是您明白了。这对GKLocalPlayerListener板条箱而言确实是一个缺陷:它应该为winreg::RegKey::get_raw_value类型实现use std::io::prelude::*; use winreg::{ enums::{RegType, HKEY_LOCAL_MACHINE, KEY_READ}, types::FromRegValue, RegValue, }; fn display_reg_value(rv: &RegValue) -> String { match rv.vtype { RegType::REG_SZ | RegType::REG_EXPAND_SZ | RegType::REG_MULTI_SZ => { String::from_reg_value(rv).unwrap_or_default() } RegType::REG_DWORD => u32::from_reg_value(rv).unwrap_or_default().to_string(), RegType::REG_QWORD => u64::from_reg_value(rv).unwrap_or_default().to_string(), _ => panic!("can only process reg value of type string, u32 or u64"), } } fn regreadvalue(regpath: &str, regvalue: &str, mut inifile: &std::fs::File) { let hklm = winreg::RegKey::predef(HKEY_LOCAL_MACHINE); let subkey = hklm.open_subkey_with_flags(regpath, KEY_READ); let thevalue = match subkey { Ok(subkey) => { let v = subkey.get_raw_value(regvalue).unwrap(); display_reg_value(&v) } Err(_) => "".to_string(), }; let iniline = format!("{}\\{}={}\n", regpath, regvalue, thevalue); let binaryiniline = iniline.as_bytes(); inifile .write_all(binaryiniline) .expect("could not write line"); } 特性。