我用一下语句列举注册表中记录的数据库信息,刚开始头两个还能正确显示,到第三个以后就只能显示三个字母,有的就显示不出来,不知为什么,请高手指点一下。RegOpenKeyEx(hd,_T("Software\\ODBC\\ODBC.INI\\ODBC Data Sources"),
0,KEY_ALL_ACCESS,&hd);
while((ret = RegEnumValue(hd,dIndex,valuename,&len,NULL,&k,vari,&ncbvari)
!=ERROR_NO_MORE_ITEMS))
{
dbname = valuename;
dIndex++;
}
RegCloseKey(HKEY_LOCAL_MACHINE);

解决方案 »

  1.   

    HKEY hKEY;
    long hResult=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_READ,&hKEY);
    if(hResult!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
    {
    ShowMessage("错误:无法打开有关注册表项");
    return FALSE;
    }
    char owner_Get[20],str[30];
    DWORD type_1=REG_SZ;
    DWORD cbData_1=20;
    DWORD aa=30,num=0,a1,a2,a3,a4,a5,a6,a7;
    hResult=::RegQueryInfoKey(hKEY,str,&a7,NULL,&a3,&a1,&a2,&num,&a4,&a5,&a6,NULL);
    if(hResult!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
    {
    ShowMessage("错误:无法打开有关注册表项");
    return FALSE;
    }
    // hResult=RegQueryValueEx(hKEY,"\\Device\\Serial0",NULL,&type_1,(BYTE*)str,&aa);
    for(DWORD i=0;i<num;i++)
    {
    aa=30;cbData_1=20;
    hResult=::RegEnumValue(hKEY,i,str,&aa,NULL,&type_1,(BYTE*)owner_Get,&cbData_1);
    if(hResult==ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
    {
    m_com.AddString(owner_Get);
    }
    }
    RegCloseKey(hKEY);
      

  2.   

    我用了你的代码还是不行,我的ODBC数据源有两个是SQL Server,两个是Access,程序只能列举SQL Server的数据源不能列举Access数据源。
      

  3.   

    A Class For Handling The Registry
    http://www.codeguru.com/Cpp/W-P/system/registry/article.php/c2877/
      

  4.   

    原因其实很简单,你每次调用的时候都必须指定ncbvari的值.
    因为每次调用后这个值就变成了你取出来的数据长度了。第三个以后就只能显示三个字母是因为你的第二个数据的长度为3,所以第三次调用的时候它就给你放了3个字符在buffer里.你应该每次都把它设置为buffer的长度.