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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb如何读取系统已安装软件并获取软件版本号相关的知识,希望对你有一定的参考价值。

最近学校作业需要用VB做一个类似360软件管家的小软件,需要实现读取电脑上已安装的软件并显示出版本号。
我不知道这个怎么做,请发尽量详细一些的说明。如有满意答案另有加分。
需要读取注册表这个原理我知道,但是就是不知道用什么方法实现,怎么能遍历键值并判断输出。

布置这类作业我估计是你们老师接到这类赚钱活儿了。

VB可以用GetSetting来读取注册表,但只能在VB区域的注册表里读出。如果希望读取系统里的数据必须从系统区域里读出注册表内容。VB里并未自带这类方法,因此必须借助Win API函数。使用起来比较复杂我倒是可以给你一些例子的,后面我可以附上。

如果只是为了做作业是不是应该用更简单的方法呢?VB里的Dir函数可以列出文件夹,通常来说额外安装的程序都会在C:\Program Files\里有相应文件夹,你只要把那里的文件夹名读出来不就可以了?代码如下:
MyPath = "c:\Program Files\" ' 指定路径。
MyName = Dir(MyPath, vbDirectory) ' 找寻第一项。
Do While MyName <> "" ' 开始循环。
' 跳过当前的目录及上层目录。
If MyName <> "." And MyName <> ".." Then
' 使用位比较来确定 MyName 代表一目录。
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
Debug.Print MyName ' 如果它是一个目录,将其名称显示出来。
End If
End If
MyName = Dir ' 查找下一个目录。
Loop

如果想通过Win API函数实现也行,给你些有关的API声明
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(dest As Any, source As Any, ByVal numBytes As Long)

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

''''//注册表 API 函数声明
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Private 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

Private Declare Function RegSetValueEx Lib "advapi32" Alias "RegSetValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, _
ByVal lpbData As Any, ByVal cbData As Long) As Long

Private Declare Function RegCreateKeyEx Lib "advapi32" Alias "RegCreateKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, _
ByVal lpClass As String, ByVal dwOptions As Long, _
ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _
phkResult As Long, lpdwDisposition As Long) As Long

Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" _
(ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, _
lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, _
lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long

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

Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal hKey As Long, ByVal lpSubKey As String) As Long

Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
(ByVal hKey As Long, ByVal lpValueName As String) As Long

Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, ByVal ipValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, _
ByVal lpValue As String, ByVal cbData As Long) As Long

Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, _
lpValue As Long, ByVal cbData As Long) As Long

Private Declare Function RegSetValueExByte Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, _
ByVal Reserved As Long, ByVal dwType As Long, _
lpValue As Byte, ByVal cbData As Long) As Long

Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" _
(ByVal hKey As Long, ByVal lpClass As String, lpcbClass As Long, _
ByVal lpReserved As Long, lpcSubKeys As Long, _
lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, lpcValues As Long, _
lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, _
lpcbSecurityDescriptor As Long, lpftLastWriteTime As FILETIME) As Long

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

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

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

''''//注册表结构
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

''''//注册表访问权
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_ALL_ACCESS = &H3F

''''//打开/建立选项
Const REG_OPTION_NON_VOLATILE = 0&
Const REG_OPTION_VOLATILE = &H1

''''//Key 创建/打开
Const REG_CREATED_NEW_KEY = &H1
Const REG_OPENED_EXISTING_KEY = &H2

''''//预定义存取类型
Const STANDARD_RIGHTS_ALL = &H1F0000
Const SPECIFIC_RIGHTS_ALL = &HFFFF

''''//严格代码定义
Const ERROR_SUCCESS = 0&
Const ERROR_ACCESS_DENIED = 5
Const ERROR_NO_MORE_ITEMS = 259
Const ERROR_MORE_DATA = 234 ''''// 错误

''''//注册表值类型列举
Private Enum RegDataTypeEnum
'''' REG_NONE = (0) ''''// No value type
REG_SZ = (1) ''''// Unicode nul terminated string
REG_EXPAND_SZ = (2) ''''// Unicode nul terminated string w/enviornment var
REG_BINARY = (3) ''''// Free form binary
REG_DWORD = (4) ''''// 32-bit number
REG_DWORD_LITTLE_ENDIAN = (4) ''''// 32-bit number (same as REG_DWORD)
REG_DWORD_BIG_ENDIAN = (5) ''''// 32-bit number
'''' REG_LINK = (6) ''''// Symbolic Link (unicode)
REG_MULTI_SZ = (7) ''''// Multiple, null-delimited, double-null-terminated Unicode strings
'''' REG_RESOURCE_LIST = (8) ''''// Resource list in the resource map
'''' REG_FULL_RESOURCE_DESCRIPTOR = (9) ''''// Resource list in the hardware description
'''' REG_RESOURCE_REQUIREMENTS_LIST = (10)
End Enum

''''//注册表基本键值列表
Public Enum RootKeyEnum
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
HKEY_PERFORMANCE_DATA_WIN2K_ONLY = &H80000004 ''''//仅Win2k
HKEY_CURRENT_CONFIG = &H80000005
HKEY_DYN_DATA = &H80000006
End Enum

''''// for specifying the type of data to save
Public Enum RegValueTypes
eInteger = vbInteger
eLong = vbLong
eString = vbString
eByteArray = vbArray + vbByte
End Enum

''''//保存时指定类型
Public Enum RegFlags
IsExpandableString = 1
IsMultiString = 2
''''IsBigEndian = 3 ''''// 无指针同样不要设置大Endian值
End Enum

Private Const ERR_NONE = 0

Function SetRegistryValue(ByVal hKey As RootKeyEnum, ByVal KeyName As String, _
ByVal ValueName As String, ByVal Value As Variant, valueType As RegValueTypes, _
Optional Flag As RegFlags = 0) As Boolean

Dim handle As Long
Dim lngValue As Long
Dim strValue As String
Dim binValue() As Byte
Dim length As Long
Dim retVal As Long

Dim SecAttr As SECURITY_ATTRIBUTES ''''//键的安全设置
''''//设置新键值的名称和默认安全设置
SecAttr.nLength = Len(SecAttr) ''''//结构大小
SecAttr.lpSecurityDescriptor = 0 ''''//默认安全权限
SecAttr.bInheritHandle = True ''''//设置的默认值

''''// 打开或创建键
''''If RegOpenKeyEx(hKey, KeyName, 0, KEY_ALL_ACCESS, handle) Then Exit Function
retVal = RegCreateKeyEx(hKey, KeyName, 0, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, SecAttr, handle, retVal)
If retVal Then Exit Function

''''//3种数据类型
Select Case VarType(Value)
Case vbByte, vbInteger, vbLong ''''// 若是字节, Integer值或Long值...
lngValue = Value
retVal = RegSetValueExLong(handle, ValueName, 0, REG_DWORD, lngValue, Len(lngValue))

Case vbString ''''// 字符串, 扩展环境字符串或多段字符串...
strValue = Value
Select Case Flag
Case IsExpandableString
retVal = RegSetValueEx(handle, ValueName, 0, REG_EXPAND_SZ, ByVal strValue, 255)
Case IsMultiString
retVal = RegSetValueEx(handle, ValueName, 0, REG_MULTI_SZ, ByVal strValue, 255)
Case Else ''''// 正常 REG_SZ 字符串
retVal = RegSetValueEx(handle, ValueName, 0, REG_SZ, ByVal strValue, 255)
End Select

Case vbArray + vbByte ''''// 如果是字节数组...
binValue = Value
length = UBound(binValue) - LBound(binValue) + 1
retVal = RegSetValueExByte(handle, ValueName, 0, REG_BINARY, binValue(0), length)

Case Else ''''// 如果其它类型
RegCloseKey handle
''''Err.Raise 1001, , "不支持的值类型"

End Select

''''// 返回关闭结果
RegCloseKey handle

''''// 返回写入成功结果
SetRegistryValue = (retVal = 0)

End Function

Function GetRegistryValue(ByVal hKey As RootKeyEnum, ByVal KeyName As String, _
ByVal ValueName As String, Optional DefaultValue As Variant) As Variant

Dim handle As Long
Dim resLong As Long
Dim resString As String
Dim resBinary() As Byte
Dim length As Long
Dim retVal As Long
Dim valueType As Long

Const KEY_READ = &H20019

''''// 默认结果
GetRegistryValue = IIf(IsMissing(DefaultValue), Empty, DefaultValue)

''''// 打开键, 不存在则退出
If RegOpenKeyEx(hKey, KeyName, 0, KEY_READ, handle) Then Exit Function

''''// 准备 1K resBinary 用于接收
length = 1024
ReDim resBinary(0 To length - 1) As Byte

''''// 读注册表值
retVal = RegQueryValueEx(handle, ValueName, 0, valueType, resBinary(0), length)

''''// 若resBinary 太小则重读
If retVal = ERROR_MORE_DATA Then
''''// resBinary放大,且重新读取
ReDim resBinary(0 To length - 1) As Byte
retVal = RegQueryValueEx(handle, ValueName, 0, valueType, resBinary(0), _
length)
End If

''''// 返回相应值类型
Select Case valueType
Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN
''''// REG_DWORD 和 REG_DWORD_LITTLE_ENDIAN 相同
CopyMemory resLong, resBinary(0), 4
GetRegistryValue = resLong

Case REG_DWORD_BIG_ENDIAN
''''// Big Endian''''s 用在非-Windows环境, 如Unix系统, 本地计算机远程访问
CopyMemory resLong, resBinary(0), 4
GetRegistryValue = SwapEndian(resLong)

Case REG_SZ, REG_EXPAND_SZ
resString = Space$(length - 1)
CopyMemory ByVal resString, resBinary(0), length - 1
If valueType = REG_EXPAND_SZ Then
''''// 查询对应的环境变量
GetRegistryValue = ExpandEnvStr(resString)
Else
GetRegistryValue = resString
End If

Case REG_MULTI_SZ
''''// 复制时需指定2个空格符
resString = Space$(length - 2)
CopyMemory ByVal resString, resBinary(0), length - 2
GetRegistryValue = resString

Case Else '''' 包含 REG_BINARY
''''// resBinary 调整
If length <> UBound(resBinary) + 1 Then
ReDim Preserve resBinary(0 To length - 1) As Byte
End If
GetRegistryValue = resBinary()

End Select

''''// 关闭
RegCloseKey handle

End Function

Public Function DeleteRegistryValueOrKey(ByVal hKey As RootKeyEnum, RegKeyName As String, _
ValueName As String) As Boolean
''''//删除注册表值和键,如果成功返回True

Dim lRetval As Long ''''//打开和输出注册表键的返回值
Dim lRegHWND As Long ''''//打开注册表键的句柄
Dim sREGSZData As String ''''//把获取值放入缓冲区
Dim lSLength As Long ''''//缓冲区大小. 改变缓冲区大小要在调用之后

''''//打开键
lRetval = RegOpenKeyEx(hKey, RegKeyName, 0, KEY_ALL_ACCESS, lRegHWND)

''''//成功打开
If lRetval = ERR_NONE Then
''''//删除指定值
lRetval = RegDeleteValue(lRegHWND, ValueName) ''''//如果已存在则先删除

''''//如出现错误则删除值并返回False
If lRetval <> ERR_NONE Then Exit Function

''''//注意: 如果成功打开仅关闭注册表键
lRetval = RegCloseKey(lRegHWND)

''''//如成功关闭则返回 True 或者其它错误
If lRetval = ERR_NONE Then DeleteRegistryValueOrKey = True

End If

End Function

Private Function ExpandEnvStr(sData As String) As String
''''// 查询环境变量和返回定义值
''''// 如: %PATH% 则返回 "c:\;c:\windows;"

Dim c As Long, s As String

s = "" ''''// 不支持Windows 95

''''// get the length
c = ExpandEnvironmentStrings(sData, s, c)

''''// 展开字符串
s = String$(c - 1, 0)
c = ExpandEnvironmentStrings(sData, s, c)

''''// 返回环境变量
ExpandEnvStr = s

End Function

Private Function SwapEndian(ByVal dw As Long) As Long
''''// 转换大DWord 到小 DWord

CopyMemory ByVal VarPtr(SwapEndian) + 3, dw, 1
CopyMemory ByVal VarPtr(SwapEndian) + 2, ByVal VarPtr(dw) + 1, 1
CopyMemory ByVal VarPtr(SwapEndian) + 1, ByVal VarPtr(dw) + 2, 1
CopyMemory SwapEndian, ByVal VarPtr(dw) + 3, 1

End Function
参考技术A 根据注册表获取已安装的相关软件和目录,并根据软件目录寻找可执行程序获取版本。

如何查看Ubuntu下已安装包版本号

1、首先登录Ubuntu后,在命令行界面输入cat /etc/issue,点击回车,即可看到ubuntu版本号。

2、或者在命令行输入lsb_release -a,点击回车也可看到ubuntu的版本号。

3、如果要查看系统内核版本,可以在命令行输入cat /proc/version。

4、输入完成后,回车即可看到Linux内核版本。

5、或者也可以在命令行输入uname -a也可看到Linux内核版本,这样就完成查询了。

参考技术A 一、查看系统信息:方法一:cat /etc/issue
方法二:cat /proc/version
方法三:uname -a
方法四:lsb_release -a
方法五:cat /etc/lsb-release

二、查看软件信息:

Ubuntu中查看已安装软件包的方法: sudo dpkg -l

在终端下也可以很方便查看已安装的软件包版本号,也能单独查看所需要的软件包是否已安装和版本号,还能查看可升级的软件包。在终端下要实现这个目标就要用到一个软件工具叫做apt-show-versions,通过apt-get安装:
$sudo apt-get install apt-show-versions
安装好之后就可以在终端下使用命令:
$apt-show-versions
来查看所有已安装的软件包和版本号,不过结果太多会一扫而过,加上终端的自有脚本more来打印每一屏的结果:
$apt-show-versions |more
这样子打印满一屏就暂停,按下回车键打印下一行,按下空格键打印下一屏,按下Q键退出打印结果。如果想查看单个软件包的版本,则使用命令:
$apt-show-versions –p <package> //<package>是软件包名,不含符号
如果想查看可升级的软件包,则使用命令:
$apt-show-versions –u
如果没有任何可以升级的软件包,上面那条命令是不会返回任何结果的。更多的参数查看man,这两个方法哪个好用仁者见仁了。
参考技术B

新立得软件包管理器

通过新立得软件包管理器就可以查看已安装的包的当前版本和源中的最新版本。

    先单击左下角的“状态”按钮之后再在上面列表中单击“已安装”即可在右侧结果列表中看到所有已安装的软件包名、已安装的版本、最新版本等信息。

    配合工具栏的“搜索”就可以快速搜索到所需要的软件包是否已安装。


终端

在终端下也可以很方便查看已安装的软件包版本号,也能单独查看所需要的软件包是否已安装和版本号,还能查看可升级的软件包。在终端下要实现这个目标就要用到一个软件工具叫做apt-show-versions,通过apt-get安装:

$sudo apt-get install apt-show-versions

或者单击下面图标安装(仅在Ubuntu下的Firefox有效):

安装好之后就可以在终端下使用命令:

$apt-show-versions

来查看所有已安装的软件包和版本号,不过结果太多会一扫而过,加上终端的自有脚本more来打印每一屏的结果:

$apt-show-versions |more

这样子打印满一屏就暂停,按下回车键打印下一行,按下空格键打印下一屏,按下Q键退出打印结果。如果想查看单个软件包的版本,则使用命令:

$apt-show-versions –p <package>    //<package>是软件包名,不含符号

如果想查看可升级的软件包,则使用命令:

$apt-show-versions –u

如果没有任何可以升级的软件包,上面那条命令是不会返回任何结果的。更多的参数查看man,这两个方法哪个好用仁者见仁了。

本回答被提问者采纳
参考技术C

如图:使用命令

  dpkg -l

(查询所有已安装软件包版本)

  可以使用“查找”搜索,抑或你可以全部复制下来看看你的系统安装了什么软件。你会发现,竟然多的都不想往下看!

以上是关于vb如何读取系统已安装软件并获取软件版本号的主要内容,如果未能解决你的问题,请参考以下文章

如何用Linux命令查看已安装的软件版本

VB仿WINDOWS 卸载程序获取已安装软件列表

电脑管家(像qq,360管家)是怎么获取到系统中安装的软件列表和补丁列表(漏洞,已安装,未安装)用C#如何实现

如何查看Ubuntu下已安装包版本号

如何查看Ubuntu下已安装包版本号

c语言获取最大软件版本号