欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

注册表读取失败

程序员文章站 2022-06-12 16:46:35
...

注册表读取失败

正常读取注册表在这里不做介绍,只是根据工作中遇到的情况做一个记录:
首先看代码:
读取注册表内容,在读取***时,必须注意你要读取数据的长度,我在这个地方花费了半天时间找问题,报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;
    }