请问怎样用vb程序判别用户计算机是否安装了Windows Media Player 9.0和realplay软件?

解决方案 »

  1.   

    同意楼上地,不过是哪个key只有自己查了!
      

  2.   

    估计是这样吧。
    要用到的API函数RegEnumValue,其详细描述:
    VB声明
    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 
    '以下的两个函数是经过王国荣老师改编过的函数,与此相关,也一并列出.并且在我们的例子程序中要用到它们。RegEnumValueAsAny可以传入长整数和字符串;RegEnumValueAsAny2中lpData参数被改成Any后,可以使用Byte数组,由于Byte数组是采用”传地址方式来传递参数的,可以省下复制字符串数据的时间,使得程序变得更加高效。
    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
    参数说明:
    hKey:Key Handle
    dwIndex:欲读取之名称的顺序
    lpValueName:返回所读取的名称
    lpcbValueName:传入lpValueName参数的长度,返回所读取的名称的长度,注意这一长度不含chr(0)
    lpReserved:保留参数,实际使用时传入ByVal 0即可
    lpType:返回所读取的数据类型
    lpData:返回所读取的数据
    lpcbData:传入lpData,返回所读取的数据长度
    返回值: =0,表示成功;≠0,表示失败。 
    调用例子:
    ret=0
    myindex=0
    while ret=0
    ret=RegEnumValue(hkey,myindex,Name,ByVal 0, typeData, ByVal vbNullString, lenData)
    myindex=myindex+1
    wend 
    一个完整的例子如下:
    '*************EnumVal2.bas***************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'在form中添加command按钮和text文本框'************EnumVal2.frm****************'以下的Command1_Click事件中我们将列举出'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run下的所有name及其Value.
    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_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", 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) 
    Text1.SelText=IIf(lenName=0, "(预设值)",Left(Name,InStr(Name,Chr(0))-1)) & "=" & S & vbCrLf 
    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) 
    Text1.SelText = Left(Name, InStr(Name, Chr(0)) - 1) & " = " & S & vbCrLf 
    ElseIf typeData = REG_MULTI_SZ Then 
    Dim SArr() As String 
    MultiStringToStringArray S, SArr 
    For j = 0 To UBound(SArr) 
    Text1.SelText = Left(Name, InStr(Name, Chr(0)) - 1) & "(" & j & ") = " & SArr(j) & vbCrLf 
    Next 
    End If 
    Case REG_DWORD, REG_DWORD_BIG_ENDIAN 
    Dim L As Long 
    RegEnumValueAsAny hKey, idx, Name, lenName, ByVal 0, typeData, L, lenData 
    Text1.SelText = Left(Name, InStr(Name, Chr(0)) - 1) & " = " & L & vbCrLf 
    Case REG_BINARY 
    ReDim bArr(0 To lenData - 1) As Byte 
    RegEnumValueAsAny hKey, idx, Name, lenName, ByVal 0, typeData, bArr(0), lenData 
    Text1.SelText = Left(Name, InStr(Name, Chr(0)) - 1) & " = " 
    For j = 0 To UBound(bArr) 
    Text1.SelText = Hex(bArr(j)) & " " 
    Next 
    Text1.SelText = vbCrLf 
    End Select 
    idx = idx + 1 
    Wend 
    RegCloseKey hKey 
    End Sub