vb读取注册表问题,怎样通过数据得到数值名称

author author     2023-04-17     185

关键词:

比如 在注册表 HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache
下有一个字符串值, 我只知道 数值数据是 QQHXLogin Microsoft 基础类应用程序
怎样用VB 通过数值数据,得到数值名称
懂的给个代码吧,谢谢

比如一个窗体里,一个text 一个按钮 点一下按钮 text就显示上面指定的数值名称

在Windows出问题时,如果能够了解Windows系统的注册表,将更容易解决问题; 许多商品化的软件或专业化的软件在您的机器上首次安装的时候都会通过改写注册表来完成软件的正确安装运行,要成为编程高手当然需要掌握读写注册表这一技术。用好注册表将会为您的应用程序增色不少,下面笔者将具体介绍VB中与注册表有关的编程方法。
注册表的组织结构
存取注册表以前, 必须先了解注册表的组织结构, 而了解注册表的组织结构最简单的方法便是启动 Windows 提供的“注册表编辑器”, 启动的方法是单击“开始”菜单的“运行”命令,输入 RegEdit 之后确定,可看到“注册表编辑器”窗口(如图1所示)。

● 键(Key) 与子键(Subkey)
注册表编辑器的结构与资源管理器很类似, 左边窗口的每一个文件夹图标表示一个键,就像文件夹下还有子文件夹一样, 注册表的键下也有子键。为了完整地表示某一个子键,习惯上是采用文件夹的路径表示法。 举例来说, HKEY_LOCAL_MACHINE 之下的“Software”子键表示成 HKEY_LOCAL_
MACHINE\Software,而“Software”之下的 “Microsoft”子键则表示成 HKEY_LOCAL_
MACHINE\Software\Microsoft

● 键值()、键名( Name)、数据( Data) 与默认键值(Default )
当我们在注册表编辑器左边窗口选取某一个键(或子键) 之后, 出现在右边窗口中的是这个键的键值(),键值可分成键名(Name)及数据(Data)两部分。对每一个键而言, 至少都含有一个默认键值(Default ) , 以 “HKEY_CLASSES_ROOT\
.bmp”子键为例, 其默认键值为 “ACDC_BMP”。 除了默认键值之外, 这个子键还含有名称 (Name)“Content Type”和数据 (Data)“image/bmp“

VB 自身提供的
关于注册表的函数
了解注册表的组织结构之后, 接下来讨论如何存取它。就像我们存取文件时必须指明文件所在文件夹(目录)一样, 存取注册表时, 则必须先指明键。键在注册表编辑器中所看到的是一长串的字符串,例如 “HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\Windows\CurrentVersion”。在 Visual Basic 6.0 内部,已经提供了一个标准的注册位置,以存储创建于VB的应用程序的程序信息:HKEY_CURRENT_USER\Software\VB and VBA Program settings\(为了叙述简单,以下将这一位置简称“标准位置”)。VB 提供了两个语句和两个函数来处理存储在应用程序注册位置的程序设置值:
函数GetSetting(appname, section, key[, default]): 检索注册表设置值。
语句SaveSetting appname,section,key,: 保存或创建注册表设置值。
函数GetAllSettings(appname, section): 返回一个包含多项注册表设置值的数组。
语句DeleteSetting appname, section[, key]: 删除注册表设置值。
以上所用参数的说明:
[ ]: 表示可选项。
appname:字符串表达式,包含应用程序或工程的名称,是标准位置下的一个子键。
section:字符串表达式,包含区域名称,是 appname 下的一个子键。
key:字符串表达式,标准位置\appname\
section子键的键名( Name)。
:字符串表达式,标准位置\appname\
section子键对应于键名( Name)的键值()。
default:表达式,如果注册表项设置中没有设置值,则返回默认值。如果省略,则 default 取值为长度为零的字符串 (“”)。
GetAllSettings返回Variant,是内容为字符串的二维数组,该二维数组包含指定区域中的所有注册表项设置值及其对应值。 如果 appname 或 section 不存在,则GetAllSettings 返回未初始化的 Variant。
实例之一
在 VB6.0中新建一工程并命名为 vbreg.vbp,删去其中所有窗体,在工程资源管理器中点击右键,选择添加模块,并命名为 vbreg.bas。双击reg.bas,输入如下代码:
Dim avntSettings As Variant
Dim intX As Integer
avntSettings = GetAllSettings(“VB 6 API 声明加载器”, “File List”)
For intX = 0 To UBound(avntSettings, 1)
Debug.Print avntSettings(intX, 0), avntSettings(intX, 1)
Next intX
上面这段程序首先用 GetAllSettings 函数检索“VB 6 API 声明加载器”子键File List部分的两个注册表项的值,并将其结果显示在立即窗口中。开始运行前请按+确保立即窗口显示在屏幕上。同时请打开注册表,以便将标准位置\VB 6 API 声明加载器\File List的键值与结果进行对照。
下面这段程序用 SaveSetting 语句在标准位置下建立名为“我的工程\我的子键”的子键,然后使用 GetSetting 函数来得到其中一项设置值并显示出来。因为有传入参数default,GetSetting 函数一定会有返回值。
请注意,区域名称不能用GetSetting 函数取得。最后,使用 DeleteSetting 语句将该子键删除。
SaveSetting “我的工程”, “我的子键”, “Top”, 75
SaveSetting “我的工程”, “我的子键”, “Left”, 50
Debug.Print “Top”, GetSetting(“我的工程”, “我的子键”, “Top”, “25”)
Debug.Print “Left”, GetSetting(“我的工程”, “我的子键”, “Left”, “0”)
’为了便于观察,调试可以在此处设置断点,同时切换到注册表,按下键刷新,即可看到自己建立的子键及其键值
DeleteSetting “我的工程”, “我的子键”
’运行完毕后再次切换到注册表并按下键刷新,观察己建立的子键及其键值是否被删除
说明: 运行本程序前,需先确保启动VB时已自动加载“API文本浏览器”,且在API文本浏览器中的“文件”菜单下有打开过的“文本文件”列表。否则,请先打开“API文本浏览器”,并在“文件”菜单下选择“打开文本文件”,打开至少一个文本文件或数据库。
Windows API 的注册表编程
VB自身虽提供了四个关于注册表的函数,但是这些函数只能在“HKEY_CURRENT_USER\
Software\VB and VBA ProgramSettings”下读取、删除、修改键值。这对于一般的应用程序利用它们可以达到目的,如果想对其他的非“标准位置”的主键或子键进行访问,该怎么办?此时,必须借助Windows API的帮助。
在Windows内部, 每一个键都会对应到一个 Key Handle(等于一个长整数值,程序中通常以 hKey表示),Windows之所以要以hKey来代表键是为了让注册表的存取更有效率,因为整数的操作效能要优于字符串, 所以我们首先来了解如何取得键的 Key Handle(即hKey)。位于最上层的键,有HKEY_CLASSES_ROOT、HKEY_CURRENT
_USER、HKEY_LOCAL_MACHINE等,这些键的hKey值是固定不变的,其值见下表:
-----------------------
Key Key Handle
-----------------------
HKEY_CLASSES_ROOT &H80000000
HKEY_CURRENT_CONFIG &H80000005 HKEY_CURRENT_USER &H80000001
HKEY_DYN_DATA &H80000006
HKEY_LOCAL_MACHINE &H80000002
HKEY_USERS &H80000003
--------------------
但如果要取得这些键的Subkey Handle,则必须调用RegOpenKey API函数,RegOpenKey含有三个参数,用法如下:
Private Declare RegOpenKey Lib “advapi32.dll” Alias “RegOpenKeyA” (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
这里hKey是Key Handle,lpSubkey是子键的字符串,PhkResult是函数返回值,若 RegOpenKey调用成功, 则此参数将传回子键的hKey。
举例来说,我们想取得HKEY_LOCAL_MA
CHINE之下的“SOFTWARE\Microsoft”子键, 则使用的声明是:
Dim ret As Long,hKey As Long
ret=RegOpenKey(HKEY_LOCAL_
MACHINE, “SOFTWARE\Microsoft”, hKey)
If ret = 0 Then
’ret=0表示成功,hKey的值等于“SOFTWARE
\Microsoft”Subkey的Key Handle
End If
请注意调用注册表API函数(例如以上的 RegOpenKey)之后,若成功将传回0,否则传回非0值,这一点与VB函数的惯例并不相同,请特别注意。
RegOpenKey 的第一个参数 hKey 除了可以指定最上层的Key Handle值(例如 HKEY_CLASSES
_ROOT、HKEY_LOCAL_MACHINE等)之外, 也可以是一个 Subkey Handle。如上例, hKey 等于“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft” 的 Subkey Handle, 接着如果我们要取得 “HKEY_
LOCAL_MACHINE\SOFTWARE\Microsoft\
Windows\CurrentVersion” 的 Subkey Handle, 则程序如下:
Dim ret As Long, hKey As Long, hKey2 As Long
ret=RegOpenKey(hKey, “Windows\Current
Version”, hKey2)
’hKey2将等于“HKEY_LOCAL_MAC
HINE\SOFTWARE\Microsoft”的“Windows\
CurrentVersion”的Subkey Handle
在以上程序中,请注意不要在“Windows\
CurrentVersion”之前加上“\”,使之成为“\Windows
\CurrentVersion”,这是错误的表示方法。
下面简单地介绍一下其他几个API(32位API):
● RegSetEx(): 在打开的注册表关键字的值域中存储数据;
● RegCloseKey(): 释放指定的关键字的句柄;
● RegQueryEx(): 在注册表中查找与您指定的键值相关的值;
● RegCreateKeyEx(): 建立并打开指定的关键字,若已存在则打开它;
● RegEnumKeyEx(): 枚举指定的注册表关键字的子关键字(32位);
● RegEnum(): 每次调用枚举指定的注册表关键字的值,复制一个带索引的值的名称和数据块;
● RegDeletekey(): 删除一个关键字以及它的子关键字;
● RegDelete(): 在指定的注册表关键字中删除一个带名字的值。
结束语
参考技术A 新建一个模块
写入代码

Option Explicit
Public Const HKEY_CLASSES_ROOT = &H80000000

Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006

Public Const REG_NONE = 0
Public Const REG_SZ = 1
Public Const REG_EXPAND_SZ = 2
Public Const REG_BINARY = 3
Public Const REG_DWORD = 4
Public Const REG_DWORD_BIG_ENDIAN = 5
Public Const REG_MULTI_SZ = 7
'注意以下的函数声明须在一行内写完
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long

Declare Function RegQueryValueEx 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

Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long

Declare Function RegEnumValueAsAny Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

Declare Function RegEnumValueAsAny2 Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, lpValueName As Any, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsA" (ByVal lpSrc As String, ByVal lpDst As String, ByVal nSize As Long) As Long

Sub MultiStringToStringArray(S As String, S2() As String)
'S为我们读取出来的多重字符串
'S2为转换后的字符串数组
Dim count As Integer, pos As Integer, pos2 As Integer, idx As Integer
pos = InStr(S, Chr(0))

While pos > 0
count = count + 1
pos = InStr(pos + 1, S, Chr(0))
Wend
'取得多重字符串中的字符串个数
count = count - 1

ReDim S2(0 To count - 1)
pos = 1
For idx = 0 To count - 1
pos2 = InStr(pos, S, Chr(0))
S2(idx) = Mid(S, pos, pos2 - pos)
pos = pos2 + 1
Next
End Sub

在form1里添加一个按钮
代码区写入:

Private Sub Command1_Click()
Dim hKey As Long, ret As Long, lenData As Long, typeData As Long
Dim Name As String
Dim lenName As Long
Dim idx As Integer, j As Integer
Dim bName(256) As Byte
ret = RegOpenKey(HKEY_CURRENT_USER, "Software\Microsoft\Windows\ShellNoRoam\MUICache", hKey)
If ret <> 0 Then Exit Sub

ret = 0
idx = 0
While ret = 0
lenName = 256

ret = RegEnumValueAsAny2(hKey, idx, bName(0), lenName, ByVal 0, typeData, ByVal vbNullString, lenData)
If ret <> 0 Then
RegCloseKey hKey
Exit Sub
End If
'上面的RegEnumValueAsAny2调用得到了第一个Name的长度lenName,不含chr(0)
Name = String(lenName + 1, Chr(0))
lenName = Len(Name)
Select Case typeData
Case REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ
Dim S As String
S = String(lenData, Chr(0))
RegEnumValueAsAny hKey, idx, Name, lenName, ByVal 0, typeData, ByVal S, lenData
If typeData = REG_SZ Then
S = Left(S, InStr(S, Chr(0)) - 1)
SHUJU = IIf(lenName = 0, "(预设值)", "") & S
If SHUJU = "QQ宠物启动程序" Then
Print Left(Name, InStr(Name, Chr(0)) - 1)
Exit Sub
End If
ElseIf typeData = REG_EXPAND_SZ Then
Dim S2 As String
S2 = String(Len(S) + 256, Chr(0))
ExpandEnvironmentStrings S, S2, Len(S2)
S = Left(S2, InStr(S2, Chr(0)) - 1)
SHUJU = S
ElseIf typeData = REG_MULTI_SZ Then
Dim SArr() As String
MultiStringToStringArray S, SArr
For j = 0 To UBound(SArr)
SHUJU = SArr(j)
Next
End If
Case REG_DWORD, REG_DWORD_BIG_ENDIAN
Dim L As Long
RegEnumValueAsAny hKey, idx, Name, lenName, ByVal 0, typeData, L, lenData
SHUJU = L
Case REG_BINARY
ReDim bArr(0 To lenData - 1) As Byte
RegEnumValueAsAny hKey, idx, Name, lenName, ByVal 0, typeData, bArr(0), lenData

For j = 0 To UBound(bArr)
SHUJU = Hex(bArr(j)) & " "
Next

End Select
idx = idx + 1
Wend
RegCloseKey hKey
End Sub

其中把If SHUJU = "QQ宠物启动程序" Then 这句里的文字修改成你所要求的
参考技术B Const HKCU = &H80000001
Const REG_SZ = 1
strKey = "Software\Microsoft\Windows\ShellNoRoam\MUICache"
Set oReg = GetObject("winmgmts:\\.\root\default:StdRegProv")
oReg.EnumValues HKCU, strKey, arrValues, arrTypes
For i = 0 To UBound(arrValues)
If arrTypes(i) = REG_SZ Then
oReg.GetStringValue HKCU, strKey, arrValues(i), strData
If strData = "QQHXLogin Microsoft 基础类应用程序" Then Text1.Text = arrValues(i)
End If
Next本回答被提问者采纳
参考技术C 加我百度HI 我可以帮你

将数据读入 R

...620:20:55【问题描述】:我正在尝试将msigdb数据库中的数据读取到我的R环境中,但是我无法将其读取为我想要的格式。现在,当我读取其中的数据时,它被读取为“整数”类型,我希望它作为“字符”类型或任何其他类型读取,... 查看详情

VB6读取注册表项下的所有值

】VB6读取注册表项下的所有值【英文标题】:VB6ReadAllValuesUnderRegistryKey【发布时间】:2011-06-2201:25:06【问题描述】:在VisualBasic6中,如何获取下键的所有值,例如:HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run这将返回以... 查看详情

用vb实现隐藏进程

...有杀毒软件下就不可用了,看看下面提示:需要通过写入注册表来启动隐藏程序的驱动的。隐藏成功后在进程管理器里是找不到挂的程序的,其它程序也无法读取挂的内存其它程序也无法读取挂的内存,这样隐藏是怎么实现的,... 查看详情

SQL从vb中的表中读取数据

】SQL从vb中的表中读取数据【英文标题】:SQLreaddatafromtableinvb【发布时间】:2009-05-2301:04:18【问题描述】:我正在尝试从数据中获取单个字段。(我正在按主键搜索,所以我应该得到0或1个答案)。请帮忙。我正在查询的表有一... 查看详情

新手关于vb.net的问题

...用的是System.IO.StreamReader和System.IO.StreamWriter类。例如说要读取一个文件,我们可以利用System.IO.StreamReader类编写一个方法(也就是函数),但是首先要在当前类的开头添加一个引用,引用名称:System.IO 查看详情

我怎样才能得到卖家的产品

...howcanIgettheproductsofthesellers【发布时间】:2019-08-0404:36:32【问题描述】:我比较了其他问题,但他们有不同的问题。我的问题是,如何(在用户活动中)显示卖家在firebase数据库中添加的所有产品?卖家在添加产品之前有自己的注... 查看详情

在vb中array()函数到有啥作用?

...ay(value1,value2,value3,etc.);其中value规定键值。键值是windows中注册表中的概念。键值位于注册表结构链末端,和文件系统的文件类似,包含当前计算机及应用程序执行时使用的实际配置信息和数据。2、关联数组的语法array(key=>value,... 查看详情

在 VB6 应用程序和 .Net 应用程序之间传递数据

...。两个应用程序都驻留在同一台机器上。我目前正在通过注册表传递这些数据,它工作得很好,但这让我有点紧张。我会用文本文件来做,但我担心数据丢失。最好的方法是 查看详情

怎样在柱状图上加数字

参考技术A问题一:excel柱形图的柱子上怎么添加上数字?图表向导_4步骤之3_图表选项_数据标志_系列名称,写上你要在柱子上写的字.下一步,完成问题二:求教excel图表上面柱状图加数字怎么弄??如图上面显示数字的。。右键点... 查看详情

如何通过工作表名称在 Perl 中读取 Excel 文件

】如何通过工作表名称在Perl中读取Excel文件【英文标题】:HowtoreadExcelfileinPerlbysheetname【发布时间】:2021-08-2200:47:36【问题描述】:我正在寻找一些关于如何编写Perl脚本的示例/建议通过工作表名称而不是工作表编号从Excel文件中... 查看详情

关于vb.net中读取excel数据存入数组后的再读取问题

读取excel数据,采用代码如下:arr1=ExcelWorkBook.Sheets("电缆参数").UsedRange.value存在问题如下:1、调试的时候查看变量,显示数组arr1的下标是从arr1(0,0)开始的,但是我用msgbox读取arr1(0,0)的值,程序提示超出数组的界限... 查看详情

尝试读取数组上的属性“名称”

】尝试读取数组上的属性“名称”【英文标题】:Attempttoreadproperty"name"onarray【发布时间】:2021-12-0704:00:03【问题描述】:我正在尝试通过表单在数据库表中输入数据。我创建了一个模型实例并访问了该表的列并分配了表... 查看详情

vb的编程公式都有哪些

...成布尔数CByte数值转成位元格式CCur数值转成货币格式CDate数据转成时间CDbl数值转成双精度浮点数CDec数据转成十进数ChDir改变目前路径缓充的路径ChDrive改变目前磁盘缓充的磁盘Chr由内码求得一字符ChrB由ASCII求得一字符ChrW由UniCode求... 查看详情

VB.NET - 给定一个日期,我怎样才能得到最后四个星期五的日期?

...wcanIgetthedateoflastfourfridays?【发布时间】:2015-07-2209:28:35【问题描述】:给定今天的日期想要获取过去四个星期的每个星期五的日期。【问题讨论】:如果今天是星期五,是否包括在内?TimSchmelter-是的,如果今天是星期五,它会... 查看详情

由于注册表引起的i/0操作发生不可恢复的错误如何解决?

...入失败而且每次说的不是同一个文件解决方法:1、启动注册表编辑器(开始->运行->Regedt32.exe)。2、在注册表中找到并单击以下注册表项:HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\SessionManager\\MemoryManagement。3、在编辑菜单上... 查看详情

怎样用vb读取excel文件中表格中的数据?

天景花园2013年1月垃圾收集统计表单位:公斤日期可回收物厨余垃圾有害垃圾其他垃圾总量1月1日5811001172851月2日5910301342961月3日601050.5139.53051月4日5511001563211月5日5811501573301、VB是常用的应用软件开发工具之一,由于VB的报表功能有... 查看详情

vb如何读取系统已安装软件并获取软件版本号

...尽量详细一些的说明。如有满意答案另有加分。需要读取注册表这个原理我知道,但是就是不知道用什么方法实现,怎么能遍历键值并判断输出。布置这类作业我估计是你们老师接到这类赚钱活儿了。VB可以用GetSetting来读取注册... 查看详情

无法读取数据库名称 Web 项目

】无法读取数据库名称Web项目【英文标题】:Can\'treaddatabasenamewebproject【发布时间】:2021-12-0920:40:09【问题描述】:试图读取数据库名称,但它在站点中不起作用。使用带有解决方案文件的asp.netWeb项目。我把它放在web.config中。... 查看详情