在修改注册表时,注册表的键值有几种,其中二进制的REG_BINARY类型的不知道如何修改,我写的代码如下:RegQueryValueEx(hdsz,vaname,NULL,&k,(BYTE*)vari,&ncbvari),其中K为REG_BINARY,vari不论为Char类型还是BYTE类型都没有办法读取到二进制类型键值的Value值,还请各位前辈帮忙!
我希望知道如何获得Vaname的键值并且修改它!
谢谢了!

解决方案 »

  1.   


    //注册表的查询修改的一般过程
    //1 打开注册表项
    //2 查询某个注册表项键值
    //3 修改某个注册表项键值
    //4 关闭注册表表项
    HHEY hKey;
    LONG lRet;
    DWORD dwType,
    BYTE pBuff[100];
    DWORD dwSize;
    if(RegOpenKey(HKEY_LOCAL_MACHINE,"Test",0,KEY_ALL_ACCESS,&hKey) !=  ERROR_SUCCESS)
    {
    TRACE("注册表打开失败!\n");
    return;
    }
    LONG lRet = RegQueryValueEx(hKey,szData,0,&dwType,pBuff,&dwSize);
    if(lRet != ERROR_SUCCESS)
    {
    TRACE("查询注册表键值失败!\n");
    return;
    }
    lRet = RegSetValueEx(hKey,szData,0,REG_BINARY,pBuff,dwSize);
    if(lRet! =ERROR_SUCCESS)
    {
    TRACE("修改注册表键值失败!\n");
    return;
    }
    lRet =RegCloseKey(hKey);
    if(lRet!= ERROR_SUCCESS)
    {
    TRACE("关闭注册表项失败!\n");
    return;
    }
      

  2.   

    是的,我也是这么写的,我打开和查询都是成功的,可是读取到的注册表键值是乱码,不知道为什么,我读取
    REG_SZ和REG_DWORD类型的键值,得到的都是正确的,对于REG_BINARY有什么特别的要求吗?
      

  3.   

    也可以用atl的CRegKey
    //打开注册表
    CRegKey RegParamter;
    TCHAR szRegName[MAX_PATH];
    _snprintf(szRegName,sizeof(szRegName),TEXT("Software\\%s\\x"),szSystemRegKey);
    if (RegParamter.Open(HKEY_CURRENT_USER,szRegName,KEY_READ)!=ERROR_SUCCESS) return;
      

  4.   

    HKEY hdsz;
    HKEY hk;
    CString RegkeyDBname;
    char *vaname;
            DWORD ncbvari;
    vaname=new char[1024];
            BYTE vari[1024];
            char *chary;
    chary=new char[1024];
    RegkeyDBname="SYSTEM\\CurrentControlSet\\Control\\COM Name Arbiter\\";
    strcpy(vaname,"ComDB");
    ClickCount++;
    delcomm();
    if(ClickCount==1)
    {
    if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegkeyDBname,0,KEY_READ,&hdsz))
    {
    DWORD k=REG_BINARY;
    if(ERROR_SUCCESS==RegQueryValueEx(hdsz,vaname,NULL,&k,(BYTE*)vari,&ncbvari))
    {
    CString xx;
    xx=(CString)vari;
    MessageBox(xx);
                             }
                     }
    }
      

  5.   

    ncbvari=1024;
    if(ERROR_SUCCESS==RegQueryValueEx(hdsz,vaname,NULL,&k,(BYTE*)vari,&ncbvari))
      

  6.   

    不行,ncbvari在运行过之后就变为读取到的Value值的长度了,换成1024还是定义为256都没有关系的,只要空间够大就行了。
      

  7.   

    RegQueryValueEx最后一个参数是in out类型,必须先告知以分配的缓冲区大小,函数返回时才将ncbvari置为实际获取到的字节数。以下代码以测试通过。
    #define PAGE_SIZE (4096)int main(int argc, char* argv[])
    {
    HKEY hKey=NULL;
    HRESULT hr;
    DWORD dwType;
    LPBYTE data=NULL;
    DWORD cbData; TCHAR szKeyName[MAX_PATH]=TEXT("SYSTEM\\CurrentControlSet\\Control\\COM Name Arbiter");
    TCHAR szValueName[MAX_PATH]=TEXT("ComDB"); hr=RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_READ, &hKey);
    if(ERROR_SUCCESS!=hr) goto Label_ErrExit;

    cbData=PAGE_SIZE;
    data=(LPBYTE)LocalAlloc(LPTR, PAGE_SIZE);
    dwType=REG_BINARY;
    hr=RegQueryValueEx(hKey, szValueName, 0, &dwType, (LPBYTE)data, (LPDWORD)&cbData);

    if(ERROR_SUCCESS!=hr) goto Label_ErrExit; printf("cb=%ld\r\n", cbData);
    LocalFree(data);
    RegCloseKey(hKey);
    getchar();
    return 0;
    Label_ErrExit:
    printf("error=%ld\r\n", GetLastError());
    if(NULL!=data) LocalFree(data);
    if(NULL!=hKey) RegCloseKey(hKey);
    getchar();
    return 0;
    }
      

  8.   

    谢谢chehw前辈,是的,可以调试通过,还没有没有办法获得ComDB的键值啊!在您的函数参数中,可以得到的是cbData,即,键值的实际长度。结果得到的Data的值还是乱码。
      

  9.   

    我修改注册表部分已经解决了,不过还是不知道REG_BINARY类型的数据该如何打印出来,还请各位前辈帮忙啊!
      

  10.   

    需要把二进制数据转换成字符串。
    例如:
    TCHAR szBinaryString[PAGE_SIZE]=TEXT("");
    DWORD x;
    LPSTR pCursor=szBinaryString;
    for(x=0;x<cbData;x++)
    {
        pCursor+=wsprintf(pCursor, "%.20x ", data[x]);
    }printf("hexstring = %s\r\n", szBinaryString);
      

  11.   

    chehw 前辈,拜托再写清楚点,我现在明白了,data值为二进制,需要打印二进制数组才可以将它显示出来,但是我参考您上面的代码还是有问题,请帮忙再说明白点,我是初学者,见谅,调出来就结贴了!谢谢您!
      

  12.   


    #include <windows.h>#define PAGE_SIZE (4096)int main(int argc, char* argv[])
    { HKEY hKey=NULL;
    HRESULT hr;
    DWORD dwType;
    LPBYTE data=NULL;
    DWORD cbData;
    DWORD x;
    LPTSTR psz=NULL;
    LPTSTR pCursor; TCHAR szKeyName[MAX_PATH]=TEXT("SYSTEM\\CurrentControlSet\\Control\\COM Name Arbiter");
    TCHAR szValueName[MAX_PATH]=TEXT("ComDB"); hr=RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_READ, &hKey);
    if(ERROR_SUCCESS!=hr) goto Label_ErrExit;

    cbData=PAGE_SIZE;
    data=(LPBYTE)LocalAlloc(LPTR, PAGE_SIZE);
    dwType=REG_BINARY;
    hr=RegQueryValueEx(hKey, szValueName, 0, &dwType, (LPBYTE)data, (LPDWORD)&cbData);

    if(ERROR_SUCCESS!=hr) goto Label_ErrExit; printf("cb=%ld\r\n", cbData);
    //** 以十六进制显示data数据,字节间以空格分隔
    psz=(LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR)*(cbData*3+1));
    pCursor=psz;
    for(x=0;x<cbData;x++)
    {
    pCursor+=wsprintf(pCursor, TEXT("%0.2x "), (BYTE)data[x]);
    }
    printf("data=%s\r\n", psz); LocalFree(psz);
    LocalFree(data);
    RegCloseKey(hKey);
    getchar();
    return 0;
    Label_ErrExit: printf("error=%ld\r\n", GetLastError());
    if(NULL!=data) LocalFree(data);
    if(NULL!=hKey) RegCloseKey(hKey);
    getchar();
    return 0;
    }