关于 RegQueryValueEx 函数的用法?

flamingo2001 2003-08-20 01:43:41
我的声明是这样的:(分别对应查字符串和非字符串两种)
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.

Public Declare Function RegQueryValueEx2 Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.

奇怪的是,如果是查询一个长整型的数据,我用一次这个函数就可以查到了:
ret= RegQueryValueEx2(phkResult, "DriverID", 0&, 0&, lRet, iSize)
值存放在lRet中

然而查询字符串值时,必须用两次才能查到所要的值,如:
sBuffer = String(1000, " ")
ret = RegQueryValueEx(phkResult, "dbq", 0&, 0&, sBuffer, lSize)
ret = RegQueryValueEx(phkResult, "dbq", 0&, 0&, sBuffer, lSize)
连写两次,才能将值查到,
这是我哪里写的不对还是它本身就是这样?
...全文
232 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
flamingo2001 2003-08-23
  • 打赏
  • 举报
回复
明白了, 3Q!
James0001 2003-08-23
  • 打赏
  • 举报
回复
加上一句 lSize = 2000& 是告诉 RegQueryValueEx ,你的缓冲的长度有 2000 个字节。
如果不初始化 lSize 的话(lSize == 0&),RegQueryValueEx 会认为你的缓冲长度是零,所以不会向缓冲区写入任何内容;同时,RegQueryValueEx 会把所需要的最小长度写入 lSize 变量。
第二次调用时,因为 lSize 已经包含了 所需要的最小长度,所以可以得到所需要的字符串。
flamingo2001 2003-08-22
  • 打赏
  • 举报
回复
那为什么 加上一句 lSize = 2000& 就可以了呢?
James0001 2003-08-22
  • 打赏
  • 举报
回复
lpcbData As Long
~~~~~~~~~~~~~~~~
lpcbData 传的是地址,也就是说,就算它的值是零,传给 RegQueryValueEx 的也不是 NULL,而是 lSize 变量的地址。
flamingo2001 2003-08-20
  • 打赏
  • 举报
回复
还是有一点不明白,
上面说“lSize=0,传递的参数是即是地址NULL”有问题,
lSize=0,并不表示他的地址为NULL呀,怎么会出错呢?
请指教!
flamingo2001 2003-08-20
  • 打赏
  • 举报
回复
多谢指教!

我查了一下MSDN,上面这样解释这个函数的参数:
lpcbData
......
The lpcbData parameter can be NULL only if lpData is NULL.

我对lSize没有赋初值,也就是lSize=0,传递的参数是即是地址NULL, 可lpData参数(即sBuffer)我给的却不是NULL,违背了“The lpcbData parameter can be NULL only if lpData is NULL. ”这句话,所以函数返回值为非0,(我在程序中没有检测返回值,难怪没有看到错误)
flamingo2001 2003-08-20
  • 打赏
  • 举报
回复
多谢指教!

我查了一下MSDN,上面这样解释这个函数的参数:
lpcbData
......
The lpcbData parameter can be NULL only if lpData is NULL.

我对lSize没有赋初值,也就是lSize=0,传递的参数是即是地址NULL, 可lpData参数(即sBuffer)我给的却不是NULL,违背了“The lpcbData parameter can be NULL only if lpData is NULL. ”这句话,所以函数返回值为非0,(我在程序中没有检测返回值,难怪没有看到错误)
James0001 2003-08-20
  • 打赏
  • 举报
回复
lSize = 2000&
ret = RegQueryValueEx(phkResult, "dbq", 0&, 0&, sBuffer, lSize)

行吗?

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧