哪个达人请看看下面的代码,Window CE下想读取注册表中HKEY_CURRENT_USER\\Keyboard Layout\\Preload的名为“1”的项的值00000804,类型是REG_SZ。语句都能执行,就是MessageBox显示的是空而不是正确的值,怎么回事呢?BOOL CRegEditDlg::OnInitDialog()
{
HKEY hKey;
DWORD dwType = REG_SZ;
         CString data;
         DWORD dwSize = 1024;
         CString szKeyName = _T("Keyboard Layout\\Preload");
long iret = RegOpenKeyEx(HKEY_CURRENT_USER,szKeyName,0,KEY_ALL_ACCESS,&hKey);
if(iret == 0)
{                                                
if(RegQueryValueEx(hKey,_T("1"),0L,&dwType,(BYTE *)&data,&dwSize))
{
MessageBox(data,_T("Query result is:"),MB_OK);
RegCloseKey(hKey);
}
else
{
CString strerr;
strerr.Format(_T("return%d"),iret);
MessageBox(strerr,_T("error"),MB_OK);
}
}
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

解决方案 »

  1.   


    #define STR_REGISTRYROOT      "SYSTEM\\CurrentControlSet\\Services\\Test"
    #define STR_REGISTRYONE       "Test"LONG CPrePowerTestDlg::GetEventSource(char* s1)
    {
    HKEY hkey;
    LONG lReturn = 0;
        char sz[256]; 
        DWORD dwtype, sl = 256; 
    memset(sz,0,256);    lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    STR_REGISTRYROOT, //
    NULL, KEY_ALL_ACCESS, &hkey); 
    if (ERROR_SUCCESS != lReturn)
    return lReturn; memset(s1,0,256); sl = 256; 
    RegQueryValueEx(hkey, STR_REGISTRYONE, NULL, &dwtype, (LPBYTE)s1, &sl); 
      

  2.   

    if(RegQueryValueEx(hKey,_T("1"),0L,&dwType,(BYTE *)&data,&dwSize)) 
    改成if(RegQueryValueEx(hKey,_T("1"),0L,&dwType,data.GetBuffer(dwSize),&dwSize)) 
      

  3.   


          char *data;  // 
            DWORD dwSize = 1024; 
            CString szKeyName = _T("Keyboard Layout\\Preload"); 
    long iret = RegOpenKeyEx(HKEY_CURRENT_USER,szKeyName,NULL,KEY_ALL_ACCESS,&hKey); 
    if(iret == 0) 
    {      
    memset(data,0,200);///
    if(RegQueryValueEx(hKey,_T("1"),NULL,&dwType,(LPBYTE)data,&dwSize)) 这样应该可以了,
      

  4.   

    if(RegQueryValueEx(hKey,_T("1"),0L,&dwType,(BYTE *)&data,&dwSize)) ?
    if(RegQueryValueEx(hKey,_T("1"),0L,&dwType,(BYTE *)&data,&dwSize) == ERROR_SUCESS) ?
    if(!RegQueryValueEx(hKey,_T("1"),0L,&dwType,(BYTE *)&data,&dwSize)) ?
      

  5.   

    If the function succeeds, the return value is ERROR_SUCCESS.#define ERROR_SUCCESS                    0LIf the function succeeds, the return value is 0L.if(RegQueryValueEx(hKey,_T("1"),0L,&dwType,(BYTE *)&data,&dwSize)) 似乎是表示读取失败
      

  6.   

    单步看下data里面是多少,你确定取到了么
      

  7.   


    BOOL CRegEditDlg::OnInitDialog() 

    HKEY hKey; 
    DWORD dwType = REG_SZ; 
            CString data; 
            DWORD dwSize = 1024; 
            CString szKeyName = _T("Keyboard Layout\\Preload"); 
    long iret = RegOpenKeyEx(HKEY_CURRENT_USER,szKeyName,0,KEY_ALL_ACCESS,&hKey); 
    if(iret == 0) 
    {                                                
    if(RegQueryValueEx(hKey,_T("1"),0L,&dwType,(LPBYTE)data.GetBuffer(),&dwSize) == ERROR_SUCESS) 

    MessageBox(data,_T("Query result is:"),MB_OK); 
    RegCloseKey(hKey); 

    else 

    CString strerr; 
    strerr.Format(_T("return%d"),iret); 
    MessageBox(strerr,_T("error"),MB_OK); 


    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE 
      

  8.   

    ERROR_SUCCESS 上面少写了一个字母
      

  9.   

    你那代码读得到值才怪,在RegQueryValueEx调用失败的时候去获取读出来的值
      

  10.   


    MessageBox(data,_T("Query result is:"),MB_OK); 
    难道楼主就想这样把data的值给打印出来?
      

  11.   

    xmzzy,改后RegQueryValueEx返回值不等于ERROR_SUCCESS,无法读值
      

  12.   


    BOOL GetReg() 

    HKEY hKey; 
    DWORD dwType = REG_SZ; 
    CString data; 
    DWORD dwSize = 1024; 
    CString szKeyName = _T("Keyboard Layout\\Preload"); 
    BYTE Value[256];
    long iret = RegOpenKeyEx(HKEY_CURRENT_USER,szKeyName,0,KEY_ALL_ACCESS,&hKey); 
    if(iret == 0) 
    {         
    iret = RegQueryValueEx(hKey,_T("CLIENTNAME"),0L,&dwType,(LPBYTE)data.GetBuffer(),&dwSize);
    if(iret == ERROR_SUCCESS) 

    CString str; str = Value;
    //MessageBox(data,_T("Query result is:"),MB_OK); 
    RegCloseKey(hKey); 

    else 

    CString strerr; 
    strerr.Format(_T("return%d"),iret); 
    //MessageBox(strerr,_T("error"),MB_OK); 


    retur
    看看iret返回值多少
      

  13.   

    唉,我也很是惊奇,我把xmzzy能正确运行的代码拷贝过来之后在我电脑上运行,首先RegOpenKeyEx函数的返回值为2,后面的还没执行就结束了。神奇啊,为啥啊
      

  14.   

    这是我以前用到的一个,通过对注册表查找一个指定的关键词,进行查找,找到目录下后,对该键进行读取,然后进行判断,如果正确,则执行操作,你可以参考一下
    // 通过注册表查找控制器安装路径
    CRegKey   key,key1;     
    DWORD   dwIndex=0,lpcbname=100,ret=0;   
    char   T_namepath[100];   
    FILETIME   lpftlast;   
    int   i=0;   

    if   (key.Open(HKEY_LOCAL_MACHINE,"SOFTWARE\\Founder QuiQ for EagleJet\\InstallInfo")==ERROR_SUCCESS)   
    {   
    for(i=0;ret==ERROR_SUCCESS;i++,dwIndex++)   
    {   

    ZeroMemory(T_namepath,100);   
    lpcbname=100;   

    ret=RegEnumKeyEx(key,dwIndex,T_namepath,&lpcbname,NULL,NULL,NULL,&lpftlast);   
    if   (ret!=ERROR_SUCCESS)   
    {   
    if   (key1.Open(key,T_namepath)==ERROR_SUCCESS)   
    {   
    ZeroMemory(T_namepath,100);   
    lpcbname=100;     
    if   (key1.QueryValue(T_namepath,"InstallDir",&lpcbname)==ERROR_SUCCESS)   
    {    
    if   (strstr(T_namepath,"EagleJet System")!=NULL)   
    {
    CString m_path=T_namepath;
    m_path=m_path+"\\";
    GetDlgItem( IDC_BKEDIT1 )->SetWindowText(m_path);
    }

    }   
    key1.Close();   
    }   
    }   
    }   
    key.Close();   
    }   
      

  15.   

    监视RegOpenKeyEx显示:RegOpenKeyEx CXX0017: 错误: 未找到符号“RegOpenKeyEx”
    啥原因啊???