以下是一个注册表写入字符串列子,该程序从ANSI转向Unicode不过为什么程序执行后,显示出来的字符却不是完整的 
在参数上输入C:\123.TXT 后却只有 “C” 一个字符呢?
LPBYTE SetContent_S;        //字符串类型
int SetValue_S (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,LPBYTE ReSetContent_S);//设置字符串值函数
int SetValue_S (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,LPBYTE ReSetContent_S)
{
    int i=0;    //操作结果:0==succeed
    //int StrLength;
    //StrLength=CString(SetContent_S).GetLength();    if(RegOpenKeyEx(ReRootKey,ReSubKey,0,KEY_WRITE,&hKey)==ERROR_SUCCESS)
    {
        if(RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,CString(SetContent_S).GetLength()*2)!=ERROR_SUCCESS)
        {
            AfxMessageBox(L"错误:无法设置有关的注册表信息");
            i=1;
        }
        RegCloseKey(hKey);
    }
    else
    {
        AfxMessageBox(L"错误:无法查询有关的注册表信息");
        i=1;
    }
    return i;
}void CRegDemoDlg::OnSetValue_S() 
{
    // TODO: Add your control notification handler code here
    RootKey=HKEY_CURRENT_USER;     //注册表主键名称
    SubKey=L"Software\\Microsoft";  //欲打开注册表值的地址
    ValueName=L"例1";               //欲设置值的名称
    SetContent_S=LPBYTE(L"成功"); //值的内容  
    CString tempstr = L"成功";    
    if((SetValue_S(RootKey,SubKey,ValueName,SetContent_S))!=0)
        AfxMessageBox(L"操作失败!");
}

解决方案 »

  1.   

    CString(SetContent_S).GetLength()*2估计是这里吧。
      

  2.   

    写入字符串时,RegOpenKeyEx 与 字符串类型必须匹配,RegOpenKeyExW 与unicode对应。
      

  3.   

    int SetValue_S(struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,TCHAR* ReSetContent_S);RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,(BYTE*)ReSetContent_S,(lstrlen(ResetContent_S)+1)*sizeof(TCHAR))
      

  4.   


    RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,CString(SetContent_S).GetLength()*2)这条语句不要这样写,可以这样写:
    如果你的工程是UNICODE编码的RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,wcslen((WCHAR*)ReSetContent_S))如果你的工程是多字节编码的RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,strlen((char*)ReSetContent_S))
      

  5.   

    因为 SetContent_S 指向的本身就是 UNICODE 字符串,所以它指向的内容的第一个字符为 C 第二个字符就是 0x00 ,CString(SetContent_S) 后,转换为 UNICODE 字符串 C ,所以 GetLength() 结果为 1 个字符,乘以 2 结果就是 2 个字节,最后 RegSetValueEx 函数向注册表中写入了两个字节的内容,这个内容正好是 UNICODE 版本中的字符 C,具体内容为:0x63 0x00你可以调试看看,看看注册表中到底是不是 0x63 0x00
      

  6.   

    ReSetContent_S是什么呢?如果是字符串,请用相应类型表示,比如LPCTSTR;如果不是,就不能用CString来处理;如果编码不对,CString不会为你转换,需要自己先转换好。
      

  7.   

    修改了下代码
    LPCTSTR SetContent_S;        //字符串类型
    int SetValue_S (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,LPCTSTR ReSetContent_S);//设置字符串值函数
    int SetValue_S (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,LPCTSTR ReSetContent_S)
    {
        int i=0;    //操作结果:0==succeed
        //int StrLength;
        //StrLength=CString(SetContent_S).GetLength();    if(RegOpenKeyEx(ReRootKey,ReSubKey,0,KEY_WRITE,&hKey)==ERROR_SUCCESS)
        {
            if(RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,(CONST BYTE *)ReSetContent_S,(_tcslen(SetContent_S) + 1) * sizeof(TCHAR))!=ERROR_SUCCESS)
            {
                AfxMessageBox(L"错误:无法设置有关的注册表信息");
                i=1;
            }
            RegCloseKey(hKey);
        }
        else
        {
            AfxMessageBox(L"错误:无法查询有关的注册表信息");
            i=1;
        }
        return i;
    }void CRegDemoDlg::OnSetValue_S() 
    {
        // TODO: Add your control notification handler code here
        RootKey=HKEY_CURRENT_USER;     //注册表主键名称
        SubKey=L"Software\\Microsoft";  //欲打开注册表值的地址
        ValueName=L"例1";               //欲设置值的名称
        SetContent_S=LPCTSTR(L"成功"); //值的内容  
        CString tempstr = L"成功";    
        if((SetValue_S(RootKey,SubKey,ValueName,SetContent_S))!=0)
            AfxMessageBox(L"操作失败!");
    }
    可是 输入 C:\\123GFG.txt 时 确只显示 C:\GFG.txt