VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 检测 Shell 部件的版本
发表评论(0)作者:子夜软件工作室, 平台:VB6.0+Win98, 阅读:8582, 日期:2001-05-26
  嗨呀呀!好久没有在自己的网站发表言论了……真是大逆不道呵!今天我们就来玩一点新花样!

  为什么还不启动你的 VB?

  一直有朋友在讨论如何获得 Shell 部件的版本,还有朋友想通过指针调用 VC++ 写的函数(我很喜欢这种想法)。所以我做了下面这个函数,可以 Try 一下(如果它可以工作,请以后多多访问我们的网站,我们还会有更多好东西;如果它不能工作,也请以后多多访问我们的网站,我们一定会更正错误)!

  源代码如下(还是老规矩,API 申明我不重复了,自己复制,如果找不到,在我们站点的“技术支持”栏目有新版本下载):

Public Function GetDllVersion(ByVal DllName As String, _
                                MajorVersion As Long, _
                                MinorVersion As Long, _
                                BuildNumber As Long, _
                                PlatformID As Long, _
                                Optional ByVal bDefaultIE3 As Boolean = True) As Boolean
    注释: 此函数用于获得 Windows 的 Shell32.DLL 等 DLL 的版本信息。
    On Local Error GoTo Shell32VerErr
    Dim SecurityAttr As SECURITY_ATTRIBUTES
    Dim hThread As Long, ThreadID As Long
    Dim hModule As Long, lpThreadAddr As Long
    Dim VerInfo As DLLVERSIONINFO
    Dim ExitCode As Long
    Dim ErrorOccurred As Integer

    ErrorOccurred = 0

    注释: 先要装入 DLL。
    hModule = LoadLibraryEx(DllName, vbNull, 0)
    If hModule Then
        注释: 然后找到函数 DllGetVersion() 的地址。
        lpThreadAddr = GetProcAddress(hModule, "DllGetVersion")
        If lpThreadAddr Then
            With SecurityAttr
                .lpSecurityDescriptor = 0
                .bInheritHandle = 0
                .nLength = Len(SecurityAttr)
            End With
            VerInfo.cbSize = Len(VerInfo)

            注释: 真可惜!VB 无法通过地址直接调用函数,所以只好建立一个线程。
            hThread = CreateThread(SecurityAttr, 0, ByVal lpThreadAddr, _
                                    VerInfo, 0, ThreadID)
            If hThread Then
                注释: 然后等待 DllGetVersion() 返回。
                Do
                    GetExitCodeThread hThread, ExitCode
                Loop Until ExitCode <> STILL_ACTIVE
                CloseHandle hThread 注释: 关闭线程。
            Else
                ErrorOccurred = 3 注释: 建立线程出错。
            End If
        Else
            ErrorOccurred = 2 注释: 找不到 DllGetVersion() 入口地址。
        End If
        FreeLibrary hModule 注释: 释放 DLL。
    Else
        ErrorOccurred = 1 注释: 无法装入 DLL。
    End If

    If Not ErrorOccurred Then
        With VerInfo
            MajorVersion = .dwMajorVersion
            MinorVersion = .dwMinorVersion
            BuildNumber = .dwBuildNumber
            PlatformID = .dwPlatformID
        End With
    ElseIf ErrorOccurred = 2 And bDefaultIE3 Then
        注释: 找不到入口地址,说明是 IE 3.0 的 4.0 版 Shell32。
        MajorVersion = 4: MinorVersion = 0: BuildNumber = 0: PlatformID = -1
    Else
        GoTo Shell32VerErr 注释: 无法预料的错误……
    End If
    GetDllVersion = True
    Exit Function

Shell32VerErr:
    GetDllVersion = False
End Function


  好了,我来解释一下这个函数如何使用:只要告诉它某个 Shell 部件(如 Shell32.DLL、ComCtl32.DLL、SHDOCVW.DLL、SHLWAPI.DLL)的路径,就可以获得版本号和操作平台标识符。工作原理是那么的简单,我就不想罗嗦了(再说我写了一些注释的)。
  同理,我们可以通过类似的方法实现“通过指针调用函数”。

  如果有什么问题,千万告诉我哦!

子夜软件工作室