我用RegOpenKeyEx()打开一个键,结果保存在句柄HKEY hKEY中。
当我再调用RegEnumValue()时程序就不能运行了。debug这个程序可以看到RegEnumValue中的第一个参数hKEY是unused,但是调用RegOpenValueEx()是可行的。
我在打开句柄的时候注意到了设置为KEY_QUERY_VALUE.
请高手指教
谢谢

解决方案 »

  1.   

    BOOL SetRegValue(const char *path, const char *pszKey, int val)
    {
    HKEY key;
    DWORD dwValue, dw;
    long ret; ret = RegOpenKeyEx (HKEY_CURRENT_USER, path, 0L, KEY_ALL_ACCESS, &key);
    if(ret != ERROR_SUCCESS)
    {
    ret = RegCreateKeyEx (HKEY_CURRENT_USER, path, 0L, NULL,
    0, KEY_ALL_ACCESS, NULL, &key, &dw);
    }
    if(ret == ERROR_SUCCESS)
    {
    dwValue = (DWORD)val;
    ret = RegSetValueEx (key, pszKey, 0L, REG_DWORD, (const BYTE*)&dwValue, sizeof(DWORD));
    RegCloseKey(key);
    return (ret==ERROR_SUCCESS);
    } return FALSE;
    }BOOL SetRegValue(const char *path, const char *pszKey, const char *val)
    {
    HKEY key;
    DWORD dw;
    long ret; ret = RegOpenKeyEx (HKEY_CURRENT_USER, path, 0L, KEY_ALL_ACCESS, &key);
    if(ret != ERROR_SUCCESS)
    {
    ret = RegCreateKeyEx (HKEY_CURRENT_USER, path, 0L, NULL,
    0, KEY_ALL_ACCESS, NULL, &key, &dw);
    }
    if(ret == ERROR_SUCCESS)
    {
    ret = RegSetValueEx (key, pszKey, 0L, REG_SZ, (const BYTE*)val, strlen(val)+1);
    RegCloseKey(key);
    return (ret==ERROR_SUCCESS);
    } return FALSE;
    }BOOL SetRegBinary(const char *path, const char *pszKey, const void *val, int len)
    {
    HKEY key;
    DWORD dw;
    long ret; ret = RegOpenKeyEx (HKEY_CURRENT_USER, path, 0L, KEY_ALL_ACCESS, &key);
    if(ret != ERROR_SUCCESS)
    {
    ret = RegCreateKeyEx (HKEY_CURRENT_USER, path, 0L, NULL,
    0, KEY_ALL_ACCESS, NULL, &key, &dw);
    }
    if(ret == ERROR_SUCCESS)
    {
    ret = RegSetValueEx (key, pszKey, 0L, REG_BINARY, (const BYTE*)val, len);
    RegCloseKey(key);
    return (ret==ERROR_SUCCESS);
    } return FALSE;
    }
      

  2.   

    我是调用RegEnumValue()是出问题的,以上那段代码能说明什么?
      

  3.   

    把你的调用RegOpenKey()和RegEnumKey()附近的代码帖上来看.我猜:
       大多数情况是HKEY未保存.
      

  4.   

    HKEY key;
    int  index = 0;
    char sub_path[260];
    char sub_name[260], szTmp[260];
    char cSystem, szWindows[260]; const char *glpath = "software\\xxxxxx\\Game";
    if(RegOpenKey(HKEY_CURRENT_USER, glpath, &key)==ERROR_SUCCESS)
    {
    index = 0;
    while(1)
    {
    if(RegEnumKey(key, index, sub_name, sizeof(sub_name))!=ERROR_SUCCESS)
    break;

    _snprintf(sub_path, sizeof(sub_path), "%s\\%s", glpath, sub_name);
    sub_path[sizeof(sub_path) -1] = 0; if(ReadRegPath(sub_path, "Path", szTmp, sizeof(szTmp)))
    {
    formula_path(szTmp, sizeof(szTmp)); //下面开始是否已经存在指定的目录
    for(int i=0; i<m_glpath_count; i++)
    {
    if(stricmp(m_glpath[i], szTmp) == 0)
    break;
    }
    //
    if(i == m_glpath_count)
    {
    strcpy(m_glpath[m_glpath_count], szTmp);
    m_glpath_count ++;
    if(m_glpath_count >= MAX_PATH_LIST)
    break;
    }
    }
    index ++;
    }//while(1)
    RegCloseKey(key);
    }
    参考参考。
      

  5.   

    这就是我的代码
             HKEY hKEY;
    LPCTSTR path="Identities\\{48C75F63-789B-47F7-96EF-752E399408E4}";
    long ret0=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage",0,KEY_QUERY_VALUE,&hKEY); 
    if(ret0!=ERROR_SUCCESS){
    AfxMessageBox("错误: 无法打开有关的hKEY!"); 
    return;
    }
    DWORD iQuery_Value=0;
    while(1){
    if(iQuery_Value==5){
    break;
    }
                   LPTSTR lpValueName=NULL;
    DWORD lpcbValueName=sizeof(lpValueName);
    DWORD type_1;
    LPBYTE pchGUID=NULL;
    DWORD lpcbData_1=sizeof(pchGUID);
    long ret1=::RegEnumValue(hKEY,iQuery_Value,lpValueName,&lpcbValueName,NULL,&type_1,pchGUID,&lpcbData_1);
    if(ret1==ERROR_NO_MORE_ITEMS){
    AfxMessageBox("Over!");
    break;
    }

    }
    ::RegCloseKey(hKEY);
      

  6.   

    更正一下:long ret0=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_QUERY_VALUE,&hKEY);
      

  7.   

    试一试用KEY_READ,另外
    LPTSTR lpValueName=NULL;
    DWORD lpcbValueName=sizeof(lpValueName);
    有误
    你可以先分配Buffer,再传入::RegEnumValue函数中
    如果你是重用同一块Buffer,记得要重新将lpcbValueName赋值
    因为lpcbValueName会被RegEnumValue 修改以下是获取DSN的代码,可供参考
    HKEY hKey = NULL;
    if(ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER,_T("Software\\ODBC\\ODBC.INI\\ODBC Data Sources"),0,KEY_READ,&hKey))
    {
    char strVal[512];
    int nIndex = 0;
    DWORD nSize  = 512;
    while(ERROR_SUCCESS == ::RegEnumValue(hKey,nIndex,strVal,&nSize,NULL,NULL,NULL,NULL))
    {
    strVal[511] = 0;
    pList->AddString(strVal);
    nSize = 512;
    nIndex ++;
    }
    }
    ::RegCloseKey(hKey);
    if(ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\ODBC\\ODBC.INI\\ODBC Data Sources"),0,KEY_READ,&hKey))
    {
    char strVal[512];
    int nIndex = 0;
    DWORD nSize  = 512;
    while(ERROR_SUCCESS == ::RegEnumValue(hKey,nIndex,strVal,&nSize,NULL,NULL,NULL,NULL))
    {
    strVal[511] = 0;
    pList->AddString(strVal);
    nSize = 512;
    nIndex ++;
    }
    }
    ::RegCloseKey(hKey);