我用RegQueryValueEx()读REG_SZ的一些值,在几条RegQureyValueEx()的顺序改变时,有时正确,有时(换个顺序时)返回值是234,用Error Lookup查一下,说是More data is available. 
我只是读进一个字符串,而字符串首址传入RegQueryValueEx()之前已经开辟了256字节的空间,怎么可能读不尽区区十来个字符的REG_SZ??
而我继续读入REG_DWORD时,也会出现这样的错误。我实在迷茫了!

解决方案 »

  1.   

    一般是这样, 如果你写入注册表的时候对于REG_SZ不使用strlen确定准确长度, 读取得时候就不对了.
      

  2.   

    LONG RegQueryValueEx(
      HKEY hKey,           // handle to key to query
      LPTSTR lpValueName,  // address of name of value to query
      LPDWORD lpReserved,  // reserved
      LPDWORD lpType,      // address of buffer for value type
      LPBYTE lpData,       // address of data buffer
      LPDWORD lpcbData     // address of data buffer size
    );
    注意一下最后一个参数
      

  3.   

    我把我的给你看看,参考参考
    //打开注册表取数据
    DWORD dwRet;
    LONG ret;
    ret=RegCreateKeyEx(HKEY_CURRENT_USER,
    "Software\\CrazyCount\\", 0L,
    NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
    NULL, &hKey, &dwRet); if(dwRet==REG_CREATED_NEW_KEY)
    {
    //创建新的键值
    WriteReg(0);
    }
    else if(dwRet==REG_OPENED_EXISTING_KEY)
    {
    //读取注册表数据
    DWORD len = 4;
    ret = RegQueryValueEx(hKey, "Current", 0, NULL,
    (BYTE*)&m_dwCurrent, &len);
    ret = RegQueryValueEx(hKey, "Num", 0, NULL,
    (BYTE*)&m_dwNum, &len);
    LPBYTE buffer=new BYTE[1024];
    len = 1024;
    ret = RegQueryValueEx(hKey, "Sentence", 0, NULL,
    buffer, &len);
    m_strSentence = (LPCSTR)buffer;
    len = 1024;
    ret = RegQueryValueEx(hKey, "Explain", 0, NULL,
    buffer, &len);
    m_strExplain = (LPCSTR)buffer;
    delete[] buffer;
    }
    else
    {
    AfxMessageBox("注册表出错!");
    return TRUE;
    } AssertReg(ret);void CCrazyCountDlg::AssertReg(LONG ret)
    {
    //显示错误信息
    if(ret)
    {
    LPTSTR lpMsg=new char[81];
    ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
    0, ret, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    lpMsg, 80, NULL);
    MessageBox(lpMsg);
    delete[] lpMsg;
    }
    }
      

  4.   

    // 函数名称        : SetRegValue
    // 描述            :  设置注册表键值
    // 返回类型        : BOOL 
    // 参数            : HKEY hkey
    // 参数            : LPCTSTR const lpSubKey
    // 参数            : LPCTSTR const lpValueName
    // 参数            : LPCTSTR const lpValueBOOL SetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPCTSTR const lpValue)
    {
        if(hkey == NULL || lpValue == NULL) return FALSE;    HKEY hkeyResult = NULL;
        LONG nResult;
        DWORD dwDisposition;    __try
        {
            // 打开注册表键
            nResult = RegCreateKeyEx(hkey, 
                lpSubKey, 
                0, 
                NULL, 
                REG_OPTION_NON_VOLATILE, 
                KEY_ALL_ACCESS, 
                NULL, 
                &hkeyResult,
                &dwDisposition);        if(nResult != ERROR_SUCCESS) __leave;        nResult = RegSetValueEx(hkeyResult, 
                lpValueName, 
                0, 
                REG_SZ,
                (LPBYTE)lpValue,
                (_tcslen(lpValue) + 1) * sizeof(TCHAR));
        }
        __finally
        {
            RegCloseKey(hkeyResult);
        }    if(nResult == ERROR_SUCCESS) return TRUE;
        return FALSE;
    }// 函数名称        : GetRegValue
    // 描述            :  获取指定注册表键的值(字符串)
    // 返回类型        : BOOL - 指示函数是否成功执行
    // 参数            : HKEY hkey - 注册表句柄
    // 参数            : LPCTSTR const lpSubKey - 子键
    // 参数            : LPCTSTR const lpValueName - 值名称
    // 参数            : LPTSTR& lpValue - 值(必须为NULL)BOOL GetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPTSTR& lpValue)
    {
        HKEY hkeyResult = NULL;
        DWORD dwDisposition;
        LPTSTR lpData = NULL;
        DWORD cbData = MAX_PATH * sizeof(TCHAR);
        LONG nResult;    if(lpValue != NULL) delete lpValue;
        lpValue = NULL;    __try
        {
            // 打开注册表键
            nResult = RegCreateKeyEx(hkey, 
                lpSubKey, 
                0, 
                NULL, 
                REG_OPTION_NON_VOLATILE, 
                KEY_ALL_ACCESS, 
                NULL, 
                &hkeyResult,
                &dwDisposition);        if(nResult != ERROR_SUCCESS) __leave;        // 获取键值
            lpData = new TCHAR[MAX_PATH];
            ZeroMemory(lpData, sizeof(TCHAR) * MAX_PATH);        DWORD dwType = REG_SZ;
            nResult = RegQueryValueEx(hkeyResult, 
                lpValueName, 
                0, 
                &dwType,
                (LPBYTE)lpData,
                &cbData);        if(nResult != ERROR_SUCCESS) __leave;
            lpValue = new TCHAR[cbData / sizeof(TCHAR) + 1];
            _tcscpy(lpValue, lpData);    }
        __finally
        {
            delete lpData;
            RegCloseKey(hkeyResult);
        }    if(nResult == ERROR_SUCCESS) return TRUE;
        return FALSE;
    }
    调用:LPTSTR lpValue = NULL;
    GetRegValue(HKEY_CURRENT_USER, TEXT("SOFTWARE\\nesgood.com\\FastTaskSwitch"), TEXT("UseAltTab"), lpValue));
    delete lpValue;
    lpValue = NULL;
    在MFC里面用可以改成使用CString
      

  5.   

    // 函数名称        : SetRegValue
    // 描述            :  设置注册表键值
    // 返回类型        : BOOL 
    // 参数            : HKEY hkey
    // 参数            : LPCTSTR const lpSubKey
    // 参数            : LPCTSTR const lpValueName
    // 参数            : LPCTSTR const lpValueBOOL SetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPCTSTR const lpValue)
    {
        if(hkey == NULL || lpValue == NULL) return FALSE;    HKEY hkeyResult = NULL;
        LONG nResult;
        DWORD dwDisposition;    __try
        {
            // 打开注册表键
            nResult = RegCreateKeyEx(hkey, 
                lpSubKey, 
                0, 
                NULL, 
                REG_OPTION_NON_VOLATILE, 
                KEY_ALL_ACCESS, 
                NULL, 
                &hkeyResult,
                &dwDisposition);        if(nResult != ERROR_SUCCESS) __leave;        nResult = RegSetValueEx(hkeyResult, 
                lpValueName, 
                0, 
                REG_SZ,
                (LPBYTE)lpValue,
                (_tcslen(lpValue) + 1) * sizeof(TCHAR));
        }
        __finally
        {
            RegCloseKey(hkeyResult);
        }    if(nResult == ERROR_SUCCESS) return TRUE;
        return FALSE;
    }// 函数名称        : GetRegValue
    // 描述            :  获取指定注册表键的值(字符串)
    // 返回类型        : BOOL - 指示函数是否成功执行
    // 参数            : HKEY hkey - 注册表句柄
    // 参数            : LPCTSTR const lpSubKey - 子键
    // 参数            : LPCTSTR const lpValueName - 值名称
    // 参数            : LPTSTR& lpValue - 值(必须为NULL)BOOL GetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPTSTR& lpValue)
    {
        HKEY hkeyResult = NULL;
        DWORD dwDisposition;
        LPTSTR lpData = NULL;
        DWORD cbData = MAX_PATH * sizeof(TCHAR);
        LONG nResult;    if(lpValue != NULL) delete lpValue;
        lpValue = NULL;    __try
        {
            // 打开注册表键
            nResult = RegCreateKeyEx(hkey, 
                lpSubKey, 
                0, 
                NULL, 
                REG_OPTION_NON_VOLATILE, 
                KEY_ALL_ACCESS, 
                NULL, 
                &hkeyResult,
                &dwDisposition);        if(nResult != ERROR_SUCCESS) __leave;        // 获取键值
            lpData = new TCHAR[MAX_PATH];
            ZeroMemory(lpData, sizeof(TCHAR) * MAX_PATH);        DWORD dwType = REG_SZ;
            nResult = RegQueryValueEx(hkeyResult, 
                lpValueName, 
                0, 
                &dwType,
                (LPBYTE)lpData,
                &cbData);        if(nResult != ERROR_SUCCESS) __leave;
            lpValue = new TCHAR[cbData / sizeof(TCHAR) + 1];
            _tcscpy(lpValue, lpData);    }
        __finally
        {
            delete lpData;
            RegCloseKey(hkeyResult);
        }    if(nResult == ERROR_SUCCESS) return TRUE;
        return FALSE;
    }
    调用:LPTSTR lpValue = NULL;
    GetRegValue(HKEY_LOCALMACHINE_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup"), TEXT("SourcePath"), lpValue));最后用完了释放内存:
    delete lpValue;在MFC里面用可以改成使用CString不好意思,刚刚贴出来的乱了。