dll文件的属性中有个版本信息,请问在VB6中,用代码怎么取得dll文件的版本信息

解决方案 »

  1.   

    Attribute VB_Name = "mGetDllVersion"
    Option ExplicitPrivate Declare Function GetFileVersionInfo Lib "Version.dll" Alias "GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal dwHandle As Long, ByVal dwLen As Long, lpData As Any) As Long
    Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function VerQueryValue Lib "Version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Any, puLen As Long) As Long
    Private Type VS_FIXEDFILEINFO
            dwSignature As Long
            dwStrucVersion As Long        '  e.g. 0x00000042 = "0.42"
    '        dwFileVersionMS As Long        '  e.g. 0x00030075 = "3.75"
    ' separate into high-order and low-order integers
            dwFileVersionMS_lo As Integer        '  e.g. "3"
            dwFileVersionMS_hi As Integer        '  e.g. ".75"
    '        dwFileVersionLS As Long        '  e.g. 0x00000031 = "0.31"
    ' separate into high-order and low-order integers
            dwFileVersionLS_lo As Integer        '  e.g. "0"
            dwFileVersionLS_hi As Integer        '  e.g. ".31"
            dwProductVersionMS As Long    '  e.g. 0x00030010 = "3.10"
            dwProductVersionLS As Long    '  e.g. 0x00000031 = "0.31"
            dwFileFlagsMask As Long        '  = 0x3F for version "0.42"
            dwFileFlags As Long            '  e.g. VFF_DEBUG Or VFF_PRERELEASE
            dwFileOS As Long              '  e.g. VOS_DOS_WINDOWS16
            dwFileType As Long            '  e.g. VFT_DRIVER
            dwFileSubtype As Long          '  e.g. VFT2_DRV_KEYBOARD
            dwFileDateMS As Long          '  e.g. 0
            dwFileDateLS As Long          '  e.g. 0
    End TypePublic Function GetFileVer(ByVal strFilePath As String) As String
        Dim lngBufferLen As Long
        Dim lngHandle As Long
        Dim strBuffer() As Byte
        Dim lngPointerBuffer As Long
        Dim lngVerLen As Long
        Dim VerBuffer As VS_FIXEDFILEINFO
        Dim strFileVer As String    ' Check for existence of file
        If Dir(strFilePath) = "" Then
            GetFileVer = "-1"
            Exit Function
        End If
        lngBufferLen = GetFileVersionInfoSize(strFilePath, lngHandle) ' lngHandle is unused
        If lngBufferLen = 0 Then
            GetFileVer = "0"
            Exit Function
        End If
        ReDim strBuffer(lngBufferLen)
        Call GetFileVersionInfo(strFilePath, 0&, lngBufferLen, strBuffer(0))
        Call VerQueryValue(strBuffer(0), "\", lngPointerBuffer, lngVerLen)
        Call CopyMemory(VerBuffer, ByVal lngPointerBuffer, Len(VerBuffer))
        strFileVer = Format(VerBuffer.dwFileVersionMS_hi) & "."
        strFileVer = strFileVer & Format$(VerBuffer.dwFileVersionMS_lo, "0") & "."
        If VerBuffer.dwFileVersionLS_hi > 0 Then
            strFileVer = strFileVer & Format(VerBuffer.dwFileVersionLS_hi, "0") & "."
        End If
        strFileVer = strFileVer & Format(VerBuffer.dwFileVersionLS_lo, "0")
        GetFileVer = strFileVer
    End Function