1、我不明白REG_LINK到底是指何种类型的数据。它的实质,长度,还有意义。
2、下面一段程序,不知所云,请各位高手指点一下,谢谢:
case REG_LINK://如果是REG_LINK型数据,其中strData是REG_LINK型数据,从用api读出的。
char tmp[512];
char ch[3];
DWORD i;
tmp[0]=0;
if(len>170)//len是REG_LINK型数据的长度
    len=170;
for(i=0;i<len;i++)//循环体中不太明白,这是在干什么?
{
BYTE ch1,ch2;
                    ch1=(BYTE)(strData[i])>>4;
ch2=(BYTE)(strData[i])&0x0f;
sprintf(ch,"%x%x ",ch1,ch2);
strcat(tmp,ch);
}
strcpy(strData,tmp);

解决方案 »

  1.   

    REG_LINK的定义:
    A Unicode symbolic link. Used internally; applications should not use this type.循环体内做的事似乎是重新处理从注册表中读得的数据,对于原数据的每一字节都拆成高4位和低4位,然后做为数值写回原数据中.由于无法了解全部,猜一下:可能是在解密.
      

  2.   

    因为读注册表中的值项时,用的是RegEnumValue()函数,而这个函数的声明如下(msdn中的):
    LONG RegEnumValue(
      HKEY hKey,              // handle to key to query
      DWORD dwIndex,          // index of value to query
      LPTSTR lpValueName,     // address of buffer for value string
      LPDWORD lpcbValueName,  // address for size of value buffer
      LPDWORD lpReserved,     // reserved
      LPDWORD lpType,         // address of buffer for type code
      LPBYTE lpData,          // address of buffer for value data
      LPDWORD lpcbData        // address for size of data buffer
    );
    显然,倒数第二个参数表示接收到的数据。是一个字符型,而如果类型(倒数第三个参数)为非REG_SZ型(如REG_LINK、REG_DWORD、REG_BINARY等),lpData肯定是"乱码",那我们应该怎么转换一下呢?使之可以显示在list中?正如windows注册表编辑器中显示的那样呢?我是用这个函数直接读的,然后将lpData显示在listView中,但lpData是乱码,所以,必须要经过转换,可是,应该怎么转换呢?我这个题目给出REG_LINK的转换方法(不太明白),而别的类型的转换方法应该是怎么样的?
      

  3.   

    其他常用类型可通过直接转化获得:
    例如REG_DWORD,DWORD dwVal;
    DWORD dwSize=sizeof(DWORD);
    RegEnumValue(hKey,dwIndex,lpValueName,lpType,(LPBYTE)&dwVal,&dwSize);只有REG_MULTI_SZ稍复杂,先读第一个字符串至'\0'结束,再读下一个,反复读取直到遇到两个'\0'.