关于RegQueryValueEx两个小问题

http://blog.csdn.net/yiyefangzhou24/article/details/6456793

RegQueryValueEx这个函数MSDN是这样解释的

This function retrieves the type and data for a specified value name associated with an open registry key. 获取一个项的设置值

 

LONG RegQueryValueEx(

  HKEY hKey,

  LPCWSTR lpValueName,

  LPDWORD lpReserved,

  LPDWORD lpType,

  LPBYTE lpData,

  LPDWORD lpcbData

);

第一个参数hKey是一个已打开项的句柄,或者指定一个标准项名。

第二个参数lpValueName是要获取值的名字。

第三个参数lpReserved未用,设为零。

第四个参数lpType用于装载取回数据类型的一个变量。

第五个参数lpData用于装载指定值的一个缓冲区。

第六个参数lpcbData用于装载lpData缓冲区长度的一个变量。一旦返回,它会设为实际装载到缓冲区的字节数。


第一,无法获取长的键值名


RegQueryValueEx在获取键内容的时候,首先需要获取键长度,否则以上一次获取的长度为准

也就是说要么你这样写:

  1. RegQueryValueEx(hKey,achValue,NULL,NULL,NULL,&ValueSize)==ERROR_SUCCESS;  
  2. RegQueryValueEx(hKey,achValue,NULL,&cType,(LPBYTE)ValueInfo,&ValueSize)==ERROR_SUCCESS;  

    要么你就在每次调用

RegQueryValueEx(hKey,achValue,NULL,&cType,(LPBYTE)ValueInfo,&ValueSize)==ERROR_SUCCESS函数之前写上ValueSize=MAX_VALUE_NAME,这个在之前的宏定义中有,是2048。

这样就可以读出长文件名了。

第二,如何读出REG_DWORD值


关于这条我也在网上找了好久,都没有什么结果,有人说用一个union结构体来解决,但是没有说具体怎么解决,如果直接用printf(“%d”,(DWORD)ValueInfo);来强制转换的话,我们会发现虽然不报错,但是数值并不对。最终这个问题是这样解决的,正如上面的代码:

  1. else if(cType==REG_DWORD||cType==REG_BINARY)  
  2. {  
  3. printf("%d/n",(long)*(short *)ValueInfo);  
  4. }  

    这样转换一下就可以了,菜鸟们可以自己去思考一下



你可能感兴趣的:(关于RegQueryValueEx两个小问题)