各位大侠: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 )
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的文档,也很有帮助的。
OpenDeviceKey 就是打开这个Device的key项
RegQueryValueEx 这个是要得到device下的项值 以及项是什么类型的(REG_DWORD这些特性) 最后一个参数是sizeof(项的类型)
最后你最好要Close一下
RegQueryValueEx
这个函数的第二个参数PC_REG_DEVINDEX_VAL_NAME 定义为
#define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
TEXT("DeviceArrayIndex") 这个不是输出打印信息吗
可以做参数吗??
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
是这样吗??
[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") 这个不是输出打印信息吗
可以做参数吗??
这两个函数最后的目地是向注册表写注册信息还是读注册表信息呢???
#define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
TEXT("DeviceArrayIndex") 这个不是输出打印信息吗
可以做参数吗??
这个不是打印信息,它是定义一个unicode字符串常量。
因为RegQueryValueEx 是win32 API,它的函数定义里,这个参数是LPCWSTR 类型的。
这个RegQueryValueEx 是读注册表啦。
周末啦,快下班拉。
引用: 引用 10 楼 yy080808 的回复:
#define PC_REG_DEVINDEX_VAL_NAME TEXT("DeviceArrayIndex")
TEXT("DeviceArrayIndex") 这个不是输出打印信息吗
可以做参数吗??
这个不是打印信息,它是定义一个unicode字符串常量。
因为RegQueryValueEx 是win32 API,它的函数定义里,这个参数是LPCWSTR 类型的。
这个RegQueryValueEx 是读注册表啦。
周末啦,快下班拉。
-----------------奶奶的,本来我们公司明天要去清远旅游的,但是居然撞上了台风,明天继续上班吧。呜呜!