qt从注册表读写REG_BINARY数据

问题的起因是我想向系统的注册表中读取QByteArray类型的数据,代码如下

QSettings *Config_ini_Read=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\Tools",QSettings::NativeFormat);
QByteArray ba_temp = Config_ini_Read->value("ProductInfo", QByteArray()).toByteArray();
delete Config_ini_Read;

此时查看QByteArray数据,发现读取到的与原本的完全不同,随后我又试了获取后转换为QString类型

QSettings *Config_ini_Read=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\DLTools",QSettings::NativeFormat);
QVariant v = Config_ini_Read->value("ProductInfo");
QByteArray ba_temp = Config_ini_Read->value("ProductInfo", QByteArray()).toByteArray();
QString qstr_temp = v.toString();
delete Config_ini_Read;

此时查看QString的数据,发现注册表信息的0x5b 0x10变成了105b,此时我很疑惑为什么QByteArray类型无法准确获取,QString类型的数据有点像,但被整合成了一位。于是我只能开始查资料了,在结果全网搜索后,我终于在qt官方的论坛找到了解决方法(但还是不知道为什么会出现这种问题,推测可能和utf8、utf16有关)

QSettings *Config_ini_Read=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\DLTools",QSettings::NativeFormat);
QVariant v = Config_ini_Read->value("ProductInfo");
QString qstr_temp = v.toString();
QByteArray data = QByteArray((const char*)qstr_temp.utf16());
delete Config_ini_Read;

此时的data数据就与注册表中的数据一致了。

关于写入,根据我查阅的资料,QSetting暂时不支持指定格式进行写入,只是自动判断格式,所以以下通过qsetting的方法写入二进制数据是无效的

QByteArray temp = "";
temp.append(QByteArray::fromHex(QByteArray::number(0x5b,16)));
temp.append(QByteArray::fromHex(QByteArray::number(0x10,16)));
temp.append(QByteArray::fromHex(QByteArray::number(0x35,16)));
temp.append(QByteArray::fromHex(QByteArray::number(0x86,16)));

QSettings *Config_ini_Write= new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\DLTools", QSettings::NativeFormat);
onfig_ini_Write->setValue("ProductInfo", temp);
delete Config_ini_Write;

此时只能使用c++自带的注册表方法了

bool AccreditDownloadWidget::writeBinaryToRegistry(const QString& keyPath, const QString& valueName, const QByteArray& data)
{
    HKEY hKey;
    LONG result = RegOpenKeyEx(HKEY_CURRENT_USER, reinterpret_cast<const wchar_t*>(keyPath.utf16()), 0, KEY_SET_VALUE, &hKey);
    if (result != ERROR_SUCCESS)
    {
        std::cerr << "Failed to open registry key." << std::endl;
        return false;
    }

    result = RegSetValueEx(hKey, reinterpret_cast<const wchar_t*>(valueName.utf16()), 0, REG_BINARY, reinterpret_cast<const BYTE*>(data.constData()), data.size());
    if (result != ERROR_SUCCESS)
    {
        std::cerr << "Failed to set registry value." << std::endl;
        RegCloseKey(hKey);
        return false;
    }

    RegCloseKey(hKey);
    return true;
}

此时注册表的写入数据为REG_BINARY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值