注册表读取失败

注册表读取失败

正常读取注册表在这里不做介绍,只是根据工作中遇到的情况做一个记录:
首先看代码:
读取注册表内容,在读取序列号时,必须注意你要读取数据的长度,我在这个地方花费了半天时间找问题,报234错误不知道什么原因,后来把长度增大正常了。
“#define REG_VALUE_SIZE 1024”
还有在写注册表时,很奇怪明明写成功了但是在注册表路径下找不到,后来在网上看一个博客说,当你的程序是32位,电脑是64位时需要添加 KEY_WOW64_64KEY,否则会写入wow64to32路径下。

BOOL GetStartupWidthReboot(CString &path, const CString regPath, const CString appKeyName)
    {
        LONG ret = 0;

        HKEY hKey = NULL;
        DWORD dwTpye = REG_SZ;
        DWORD dwValue = REG_VALUE_SIZE; //这个大小一定要先求出来,否则会出错(234),此处的大小一定要足够大,否则会报234错误,长度不够
        char data[REG_VALUE_SIZE];  //一定要分配内存,否则也会出错
        memset(data, 0, REG_VALUE_SIZE);

        //打开注册表
        //ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegPath, 0, KEY_QUERY_VALUE|KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
        ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hKey);
        if (ERROR_SUCCESS != ret)
        {
            TRACE(TEXT("打开注册表失败!"));
            return FALSE;
        }

        //读注册表                               //valuename                //返回value类型 //数据缓存区 //缓存区大小
        ret = RegQueryValueEx(hKey, appKeyName, NULL, &dwTpye, (BYTE*)data, &dwValue);
        if (ERROR_SUCCESS != ret)
        {
            TRACE(TEXT("\n读取注册表失败!"));
            RegCloseKey(hKey);
            return FALSE;
        }
        TRACE(TEXT("\n读取注册表成功!"));

        path.Format(_T("%s"), data);
        TRACE(path);

        RegCloseKey(hKey);

        return TRUE;
    }
BOOL SetStartupWithReboot(const CString regPath, const CString appKeyName, CString appKeyValue) // 模式1设置开机启动,模式2删除开机启动
    {
        LONG nResult = -1;
        HKEY hRegKey = NULL;

        nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hRegKey);
        if (nResult == ERROR_SUCCESS)
        {
            TRACE(_T("打开注册表成功。"));
            TCHAR *appPath = Common::Instance()->CString2TCHAR(appKeyValue);
            nResult = RegSetValueEx(hRegKey, appKeyName, 0, REG_SZ, (const unsigned char *)appPath, appKeyValue.GetLength());//m_szAppPath是要开机启动的程序的路径
            if (nResult == ERROR_SUCCESS)
            {
                TRACE(_T("设置成功。"));
            }
            else
            {
                TRACE(_T("设置失败。"));
            }

            RegCloseKey(hRegKey);
        }
        else
        {
            TRACE(_T("打开注册表失败。"));
            return FALSE;
        }

        return TRUE;
    }
BOOL DeleteStartup(const CString regPath, const CString appKeyName)
    {
        // 获取工程文件完整文件名
        TCHAR appPath[MAX_PATH];
        DWORD dwRes = ::GetModuleFileName(NULL, appPath, MAX_PATH);

        CString szLogMessage;
        szLogMessage.Format(_T("取得程序完整路径:%s"), appPath);
        TRACE(szLogMessage);

        LONG nResult;
        HKEY hRegKey = NULL;

        nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hRegKey);
        if (nResult == ERROR_SUCCESS)
        {
            TRACE(_T("打开注册表成功。"));

            nResult = RegDeleteValue(hRegKey, appKeyName);
            if (nResult == ERROR_SUCCESS)
            {
                TRACE(_T("ok"));
            }
            else
            {
                TCHAR szBuffer[1024];
                FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                    NULL, nResult, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                    szBuffer, sizeof(TCHAR), NULL);
                szLogMessage.Format(_T("删除注册表项失败:[%s]"), szBuffer);
                TRACE(szLogMessage);
            }

            RegCloseKey(hRegKey);
        }
        else
        {
            TRACE(_T("打开注册表失败。"));

            return FALSE;
        }

        return TRUE;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值