OpenDeviceKey和RegQueryValueEx

alan_zhang   2008-8-21 23:57 楼主
各位大侠:OpenDeviceKey和RegQueryValueEx这两个函数配合主要完成一个什么任务的??
hKey = OpenDeviceKey(regKeyPath);        if ( hKey == NULL ) {
                DEBUGMSG(ZONE_INIT | ZONE_ERROR,(TEXT("Failed to open device key\r\n")));
                return ( FALSE );        
        }

        // Okay, we're finally ready to try and load our registry data.
        dwDataSize = PC_REG_DEVINDEX_VAL_LEN;//dwDataSize =sizeof(DWORD)
        regError = RegQueryValueEx(
                                        hKey,
                                        PC_REG_DEVINDEX_VAL_NAME,
                                        NULL,
                                        NULL,
                                        (LPBYTE)(&pHWHead->dwDevIndex),
                                        &dwDataSize);

        if ( regError == ERROR_SUCCESS ) {
                dwDataSize = PC_REG_IRQ_VAL_LEN;
                regError = RegQueryValueEx(
                                        hKey,
                                        PC_REG_IRQ_VAL_NAME,
                                        NULL,
                                        NULL,
                                        (LPBYTE)(&pHWHead->dwIRQ),
                                        &dwDataSize);
        }

        if ( regError == ERROR_SUCCESS ) {
                dwDataSize = PC_REG_IOBASE_VAL_LEN;
                regError = RegQueryValueEx(
                                        hKey,
                                        PC_REG_IOBASE_VAL_NAME,
                                        NULL,
                                        NULL,
                                        (LPBYTE)(&pHWHead->dwIOBase),
                                        &dwDataSize);
        }

        if ( regError == ERROR_SUCCESS ) {
                dwDataSize = PC_REG_IOLEN_VAL_LEN;
                regError = RegQueryValueEx(
                                        hKey,
                                        PC_REG_IOLEN_VAL_NAME,
                                        NULL,
                                        NULL,
                                        (LPBYTE)(&pHWHead->dwIOLen),
                                        &dwDataSize);
        }
问题:
1、hKey = OpenDeviceKey(regKeyPath)是为了在路径为regKeyPath中取一个注册表键值放在hKey中吗
2、regError = RegQueryValueEx(
                                        hKey,
                                        PC_REG_DEVINDEX_VAL_NAME,
                                        NULL,
                                        NULL,
                                        (LPBYTE)(&pHWHead->dwDevIndex),
                                        &dwDataSize);
                             }其中PC_REG_DEVINDEX_VAL_NAME定义为 #define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
   这个是什么意思呢?
3、然后连着三个if ( regError == ERROR_SUCCESS )
   这个函数名称是Ser_GetRegistryData  这些判断的目的是做什么呢?
4、所有dwDataSize的定义都是 sizeof( DWORD )

回复评论 (12)

ZJ
顶一下
点赞  2008-8-22 09:36
1)regKeyPath 指向一个字符串,你可以打印其内容,比如为“Drivers\Active\03",03是随便写的,是一个十进制数,对应你当前的驱动
  系统起来后,你可以通过pb上tools里的remote registry editor查看注册表,HKEY_LOCAL_MACHINE\Drivers\Active\03,
  会看到有项 为 key, 其值为 Drivers\buildin\yourdevice
  
  你的 OpenDeviceKey()就是打开了这个HKLM\Drivers\buildin\yourdevice的键,简单来说,就是打开注册表键。

2)RegQueryValueEx 对key进行检索,看有没有你要找的那一项。
所以在你的platform.reg,应该有如下定义:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\yourdevice]
“Dll”="yourdevicedriver.dll"
“DeviceArrayIndex”=dword:3    ;根据你的代码,应该还有PC_REG_IRQ_VAL_NAME,PC_REG_IOBASE_VAL_NAME等定义         
。。。。。。。。

3)regError 是判断是否出错的,如果没有你要读的项,就不是ERROR_SUCCESS啦。
4)dwDataSize是你要读的数据的大小,如果是char,那就是sizeof(char),那如果注册表定义这个是dword,自然就是sizeof(DWORD)

前段时间刚刚看了这部分,你自己看看ms的文档,也很有帮助的。
点赞  2008-8-22 10:53
OpenDeviceKey 就是打开这个Device的key项
RegQueryValueEx 这个是要得到device下的项值 以及项是什么类型的(REG_DWORD这些特性) 最后一个参数是sizeof(项的类型)

最后你最好要Close一下
点赞  2008-8-22 11:48
RegQueryValueEx
这个函数的第二个参数PC_REG_DEVINDEX_VAL_NAME 定义为
#define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
TEXT("DeviceArrayIndex") 这个不是输出打印信息吗
可以做参数吗??
点赞  2008-8-22 13:46
1、是不是OpenDeviceKey就是打开我添加驱动时写的那个注册表信息的?
2、如果1成立,根据RegQueryValueEx这个函数,说明在我的注册表信息中一定要有
   PC_REG_DEVINDEX_VAL_NAME    #define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")     PC_REG_IRQ_VAL_NAME         #define PC_REG_IRQ_VAL_NAME TEXT("IRQ")
   PC_REG_IOBASE_VAL_NAME      #define PC_REG_IOBASE_VAL_NAME TEXT("IoBase")
   PC_REG_IOLEN_VAL_NAME       #define PC_REG_IOLEN_VAL_NAME TEXT("IoLen")
也就是
    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\yourdevice]
“Dll”="yourdevicedriver.dll"
“DeviceArrayIndex”=dword:3
"IRQ"=......
"IoBase"=....
  "IoLen"=.....

程序通过RegQueryValueEx这个函数一项一项读取,然后通过(LPBYTE)(&pHWHead->dwIRQ), &dwDataSize);
设置结构体pHWHead
是这样吗??
点赞  2008-8-22 14:00
是的,2楼说的也很好
点赞  2008-8-22 14:55
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
   "SysIntr"=dword:13
   "IoBase"=dword:02F8
   "IoLen"=dword:8
   "DeviceArrayIndex"=dword:0
   "Prefix"="COM"
   "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
   "Dll"="Com16550.Dll"
   "Order"=dword:0
   "Priority"=dword:0

注册表中果然有这些项,可是缺少一项"IRQ"=......
还有这个问题:
RegQueryValueEx
这个函数的第二个参数PC_REG_DEVINDEX_VAL_NAME 定义为
#define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
TEXT("DeviceArrayIndex") 这个不是输出打印信息吗
可以做参数吗??
点赞  2008-8-22 15:08
这两个函数最后的目地是向注册表写注册信息还是读注册表信息呢???
点赞  2008-8-22 15:09
看MSDN一清二楚了
点赞  2008-8-22 15:23
#define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
TEXT("DeviceArrayIndex") 这个不是输出打印信息吗
可以做参数吗??

这个不是打印信息,它是定义一个unicode字符串常量。
因为RegQueryValueEx 是win32 API,它的函数定义里,这个参数是LPCWSTR 类型的。

这个RegQueryValueEx 是读注册表啦。

周末啦,快下班拉。
点赞  2008-8-22 16:43
mark
点赞  2008-8-22 16:45
引用: 引用 10 楼 yy080808 的回复:
#define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
TEXT("DeviceArrayIndex") 这个不是输出打印信息吗
可以做参数吗??

这个不是打印信息,它是定义一个unicode字符串常量。
因为RegQueryValueEx 是win32 API,它的函数定义里,这个参数是LPCWSTR 类型的。

这个RegQueryValueEx 是读注册表啦。

周末啦,快下班拉。


-----------------奶奶的,本来我们公司明天要去清远旅游的,但是居然撞上了台风,明天继续上班吧。呜呜!
点赞  2008-8-22 17:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复