代码之家  ›  专栏  ›  技术社区  ›  Adrian

注册表c中枚举值的帮助++

  •  0
  • Adrian  · 技术社区  · 16 年前
     DWORD type = REG_NONE;
     int i = 0;
     size = sizeof(ValueName);
     size2 = sizeof(ValueData);
     BOOL bContinue = TRUE;
    
     do
     {
      lRet = RegEnumValue(Hkey , i , ValueName , &size , 0 , &type , ValueData , &size2);
      switch(lRet)
      {
      case ERROR_SUCCESS:
       print_values(ValueName , type , ValueData , size2);
       i++;
       size = sizeof(ValueName);
       size2 = sizeof(ValueData);
       break;
      case ERROR_MORE_DATA:
       size2 = sizeof(ValueData);
       if(NULL != ValueData) delete [] ValueData;
       ValueData = new BYTE[size2];
       break;
      case ERROR_NO_MORE_ITEMS:
       bContinue = false;
       break;
      default:
       cout << "Unexpected error: " << GetLastError() << endl;
       bContinue = false;
       break;
      }
     }while(bContinue);
    

    总是出错,没有更多的数据,为什么-/

    抱歉,提示:ERROR\u MORE\u DATA:)我更改了一些内容,仍然无法工作

    class Registry {
    public:
        Registry();
        ~Registry();
        bool open_key_ex(HKEY hkey, const char * key, HKEY & hkey_out);
        void querry_info_key(HKEY);
        void enum_key(HKEY , DWORD);
        void enum_value(HKEY);
        void print_values(LPCSTR , DWORD , LPBYTE , DWORD);
        void run();
    private:
        HKEY hkey;
        long lRet;
        FILETIME filetime;
        DWORD sub_keys;
        TCHAR* ValueName;
        DWORD size;
        LPBYTE ValueData;
        DWORD size2;
        HKEY a;
        DWORD MaxValueLen;
        DWORD MaxDataLen;
    
    };
    
    Registry::Registry()
    {
        ValueName = new TCHAR[MAX_PATH];
        ValueData = NULL;
        MaxValueLen = MAX_PATH + 1;
        MaxDataLen = 0;
    }
    
    Registry::~Registry()
    {
        delete [] ValueName;
    }
    
    void Registry::enum_value(HKEY Hkey)
    {
        DWORD type = REG_NONE;
        int i = 0;
        size2 = MaxDataLen;
        BOOL bContinue = TRUE;
    
        do
        {
            lRet = RegEnumValue(Hkey , i , ValueName , &size , 0 , &type , ValueData , &size2);
            size = MaxValueLen;
            switch(lRet)
            {
            case ERROR_SUCCESS:
                print_values(ValueName , type , ValueData , size2);
                size2 = MaxDataLen;
                i++;
                break;
            case ERROR_MORE_DATA:
                MaxDataLen = size2;
                if(NULL != ValueData) delete [] ValueData;
                ValueData = new BYTE[MaxDataLen];
                break;
            case ERROR_NO_MORE_ITEMS:
                bContinue = false;
                break;
            default:
                cout << "Unexpected error: " << GetLastError() << endl;
                bContinue = false;
                break;
            }
        }while(bContinue);
    }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Fred Larson    16 年前

    我怀疑与此有关:

    size2 = sizeof(ValueData);
    

    虽然我没有看到 ValueData ,很明显它是指针,而不是数组。因此, sizeof 将为您提供指针的大小,而不是它所指向的缓冲区的大小。你需要自己记录尺码。同样的情况也可能发生在 ValueName ,但我不知道。

    http://msdn.microsoft.com/en-us/library/ms724865%28VS.85%29.aspx

    如果lpData指定的缓冲区是 函数返回ERROR\u MORE\u DATA和 将所需的缓冲区大小存储在 未定义。