windows API读写注册表笔记mfc

1 篇文章 0 订阅
1 篇文章 0 订阅


.h 

#pragma once
#include "pch.h"
class m_lu
{
    
public:
    m_lu();
    m_lu(CString m_jing_path);
    ~m_lu();

    CString data() {//获取返回值
        m_jing_path;
        return m_jing_path;
    }
    void m_jing();


private:

    CString m_jing_path;
};


----------------------------------------------------------------------------------------------------------

.cpp

#include "pch.h"
#include "m_lu.h"
m_lu::m_lu()
{
}
m_lu::m_lu(CString m_jing_path1){//初始化
    m_jing_path = m_jing_path1;
}

m_lu::~m_lu()
{
}

void m_lu::m_jing()//class
{
    HKEY hkey = NULL;//注册表句柄默认为空
    TCHAR* lpszSubkey = (TCHAR*)_T("SOFTWARE\\Classes\\ldmnq.apk\\Shell\\Open\\Command");//注册表路径除去开头\\后面的都需要
    LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubkey, 0, KEY_ALL_ACCESS, &hkey);//打开注册表
    if (lRet == ERROR_SUCCESS) {//判断是否打开,打开继续执行
        DWORD maxValueDataLen = 0;//数据类型初始化
        lRet = RegQueryInfoKey(hkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &maxValueDataLen/*获取数据字符串长度*/, NULL, NULL);

        if (lRet == ERROR_SUCCESS) {//再次判断
            DWORD dwType = 0;//默认天0
            BYTE* lpData = new BYTE[maxValueDataLen + 1];//获取长度+1防止有空格
            ZeroMemory(lpData, maxValueDataLen + 1);
            lRet = RegQueryValueEx(hkey, NULL, NULL, &dwType, lpData, &maxValueDataLen/*长度*/);

            CString strValue((LPCTSTR)lpData, maxValueDataLen); // 使用 CString 构造函数进行转换
            /*MessageBox(NULL, strValue, _T("Value"), MB_OK);*/
            delete[] lpData;
            int found = strValue.ReverseFind('\\');  // 找到最后一个反斜杠的位置
            if (found != -1) {
                m_jing_path = strValue.Left(found + 1);  // 将路径赋值给m_jing_path
                m_jing_path.Replace(L"\\", L"\\");   // 将单个反斜杠替换为双反斜杠

            }
        }
        RegCloseKey(hkey);//关闭注册表
    }

}


-------------------------------------------------------------------------------------------------

.cpp 声明与使用
int main() {


    m_lu ma;
    ma.m_jing(); // 这里会从注册表中获取路径并赋值给 m_jing_path
    CString result = ma.data(); // 获取 m_jing_path 的值
    
    result;

    return 0;
}


 

可以使用Qt的QSettings类来读写注册表数据,也可以直接调用Windows API读写注册表数据。 以下是调用Windows API读写注册表数据的示例代码: ```c++ #include <windows.h> // 读取注册表中的字符串值 bool readRegistryString(HKEY hKey, const QString& subKey, const QString& valueName, QString& value) { HKEY hSubKey = NULL; DWORD dwType = REG_SZ; DWORD dwSize = 0; if (RegOpenKeyEx(hKey, subKey.toStdWString().c_str(), 0, KEY_READ, &hSubKey) != ERROR_SUCCESS) return false; if (RegQueryValueEx(hSubKey, valueName.toStdWString().c_str(), NULL, &dwType, NULL, &dwSize) != ERROR_SUCCESS) { RegCloseKey(hSubKey); return false; } if (dwType != REG_SZ) { RegCloseKey(hSubKey); return false; } WCHAR* pBuffer = new WCHAR[dwSize / sizeof(WCHAR)]; if (RegQueryValueEx(hSubKey, valueName.toStdWString().c_str(), NULL, NULL, (LPBYTE)pBuffer, &dwSize) != ERROR_SUCCESS) { RegCloseKey(hSubKey); delete[] pBuffer; return false; } value = QString::fromWCharArray(pBuffer, dwSize / sizeof(WCHAR)); delete[] pBuffer; RegCloseKey(hSubKey); return true; } // 写入字符串值到注册表中 bool writeRegistryString(HKEY hKey, const QString& subKey, const QString& valueName, const QString& value) { HKEY hSubKey = NULL; if (RegCreateKeyEx(hKey, subKey.toStdWString().c_str(), 0, NULL, 0, KEY_WRITE, NULL, &hSubKey, NULL) != ERROR_SUCCESS) return false; if (RegSetValueEx(hSubKey, valueName.toStdWString().c_str(), 0, REG_SZ, (LPBYTE)value.toStdWString().c_str(), (value.length() + 1) * sizeof(wchar_t)) != ERROR_SUCCESS) { RegCloseKey(hSubKey); return false; } RegCloseKey(hSubKey); return true; } int main(int argc, char *argv[]) { // 读取注册表中的字符串值 QString value; if (readRegistryString(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", "Shell Folders", value)) qDebug() << value; // 写入字符串值到注册表中 if (writeRegistryString(HKEY_CURRENT_USER, "Software\\MyCompany\\MyApp", "MyValue", "Hello World")) qDebug() << "Write registry success."; return 0; } ``` 以上代码演示了如何使用Windows API读写注册表数据。其中,readRegistryString函数用于读取注册表中的字符串值,writeRegistryString函数用于将字符串值写入注册表中。在main函数中,我们首先使用readRegistryString函数读取注册表中的Shell Folders值,并输出到控制台上,然后使用writeRegistryString函数将字符串值Hello World写入到注册表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值