//注册表操作
HKEY hKey;
wchar_t content[256]; //所查询注册表键值的内容
DWORD dwType=REG_SZ; //定义读取数据类型
DWORD dwDisposition=256;
DWORD dwLength=256;
struct HKEY__*RootKey; //注册表主键名称
TCHAR *SubKey; //欲打开注册表项的地址
TCHAR *KeyName; //欲设置项的名字
TCHAR *ValueName; //欲设置值的名称
LPBYTE SetContent_S; //字符串类型
int SetContent_D[256]; //DWORD类型
BYTE SetContent_B[256]; //二进制类型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())!=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"成功");   //值的内容

if((SetValue_S(RootKey,SubKey,ValueName,SetContent_S))!=0)
AfxMessageBox(L"操作失败!");
}=========================================================================etContent_S=LPBYTE(L"成功"); 这段在运行程序后... 注册表项内容却只实现 成  缺少功。
 还有若改成 英文 情况更糟请问这是为什么?

解决方案 »

  1.   

    RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,CString(SetContent_S).GetLength()*sizeof(TCHAR))
      

  2.   

    wchar_t的宽字符串,你的取长度方法是不合适的
      

  3.   

    给你一个建议就是对字符串进行转换
    int WideCharToMultiByte(
      UINT CodePage,            // code page
      DWORD dwFlags,            // performance and mapping flags
      LPCWSTR lpWideCharStr,    // wide-character string
      int cchWideChar,          // number of chars in string.
      LPSTR lpMultiByteStr,     // buffer for new string
      int cbMultiByte,          // size of buffer
      LPCSTR lpDefaultChar,     // default for unmappable chars
      LPBOOL lpUsedDefaultChar  // set when default char used
    );
      

  4.   

    还有,我建议你全部用char,不要用wchar_t
      

  5.   

    CString str = "成功";
    int ret = RegSetValueEx(hKey, pTmp, NULL, REG_SZ, (LPBYTE)str.GetBuffer(str.GetLength()), strlen(str));
    我这样用,就没有问题!
      

  6.   

    把所有的L宏定义给去掉,所有的定义为char,赋值函数用strcpy
      

  7.   

    RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,1024);
    直接改成1024,只要大于ReSetContent_S的实际长度就行
      

  8.   

    RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,CString(SetContent_S).GetLength()*BYTE
      

  9.   


     error C2275: “BYTE”: 将此类型用作表达式非法
      

  10.   

    RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,ReSetContent_S,CString(SetContent_S).GetLength()*sizeof(BYTE)
    sorry.笔误
      

  11.   

    调试下,RegSetValueEx最后一个参数不够大
      

  12.   

    调试下,RegSetValueEx最后一个参数不够大
      

  13.   

    RegSetValueEx最后一个参数
     指的是哪个?
      

  14.   

    这个CString(SetContent_S).GetLength()*sizeof(BYTE) 
      

  15.   


    这个又回到刚才的情况 就是中文支持好 英文不全BYTE改成w_char试试出错
      

  16.   

    BOOL SetString(HKEY hRootKey, LPCTSTR lpszSubKey, LPCTSTR lpszValueName, LPCTSTR lpszValue)
    {
    if (NULL == hRootKey || 
    NULL == lpszSubKey || '\0' == *lpszSubKey || 
    NULL == lpszValueName || '\0' == *lpszValueName ||
    NULL == lpszValue)
    {
    return FALSE;
    }

    HKEY hkValue;
    BOOL bRet = FALSE; //创建注册表键值。
    if (RegCreateKey(hRootKey, lpszSubKey, &hkValue) == ERROR_SUCCESS)
    {
    //向键值写入数据。
    bRet = RegSetValueEx(hkValue, lpszValueName, 0, REG_SZ, (CONST BYTE *)lpszValue, (_tcslen(lpszValue) + 1) * sizeof(TCHAR)) == ERROR_SUCCESS;
    //关闭键。
    RegCloseKey(hkValue);
    } return bRet;
    }
      

  17.   

        if(RegOpenKeyEx(ReRootKey,ReSubKey,0,KEY_WRITE,&hKey)==ERROR_SUCCESS)
        {
            if(RegSetValueEx(hKey,ReValueName,NULL,REG_SZ,CString(ReSetContent_S),CString(SetContent_S).GetLength())!=ERROR_SUCCESS)
            {
                AfxMessageBox(L"错误:无法设置有关的注册表信息");
                i=1;
            }
            RegCloseKey(hKey);
        }
        else
        {
            AfxMessageBox(L"错误:无法查询有关的注册表信息");
            i=1;
        }
        return i;
      

  18.   

    我也遇见这样的问题了,是字符集的问题,你如果建的项目是UNCIODE的就会有这样的问题
    ,要是多字节的就没有,如果是多字节的最后个参数就要填大一点!!!