Public Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Public Declare Function GetFileSize Lib "kernel32" Alias "GetFileSize" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Public Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Public Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer
Public Declare Function GetFileType Lib "kernel32" Alias "GetFileType" (ByVal hFile As Long) As Long
Public 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
Public Declare Function GetFileVersionInfoSize Lib "version.dll" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, lpdwHandle As Long) As Long

解决方案 »

  1.   

    这是我学别人的代码,很棒的!
    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 Function VerQueryValue Lib "version.dll" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, lplpBuffer As Any, puLen As Long) As Long
    Private Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (dest As Any, ByVal Source As Long, ByVal Length As Long)
    Private Declare Function lstrcpy Lib "Kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
    Private Declare Function VerLanguageName Lib "Kernel32" Alias "VerLanguageNameA" (ByVal wLang As Long, ByVal szLang As String, ByVal nSize As Long) As Long
    Private Const Syn_kg = " "
    Private Const Syn_pzh = "\"
    Public Function GetFileVerInfo(FullFileName As String) As String
        Dim rc As Long, lDummy As Long, sBuffer() As Byte
        Dim lBufferLen As Long, lVerPointer As Long
        Dim bytebuffer(260) As Byte
        Dim Lang_Charset_String As String
        Dim HexNumber As Long, Buffer As String
        Dim i As Integer, strtemp As String
        Dim strFileVer(5) As String  For i = 0 To 5
        strFileVer(i) = "" '"No Version Info available!"
      Next
      '*** Get size ****
      lBufferLen = GetFileVersionInfoSize(FullFileName, lDummy)
      If lBufferLen < 1 Then
          GetFileVerInfo = strFileVer(0)
          Exit Function
      End If  '**** Store info to udtVerBuffer struct ****
      ReDim sBuffer(lBufferLen)
      rc = GetFileVersionInfo(FullFileName, 0&, lBufferLen, sBuffer(0))
            If rc = 0 Then
                GetFileVerInfo = strFileVer(0)
                Exit Function '"No Version Info available!"
            End If
      rc = VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", lVerPointer, lBufferLen)
            If rc = 0 Then
                GetFileVerInfo = strFileVer(0)
                Exit Function '"No Version Info available!"
            End If
            
            
        strFileVer(2) = "CompanyName"
        strFileVer(4) = "FileDescription"
        strFileVer(0) = "FileVersion"
        strFileVer(1) = "InternalName"
        strFileVer(3) = "LegalCopyright"
            MoveMemory bytebuffer(0), lVerPointer, lBufferLen
        HexNumber = bytebuffer(2) + bytebuffer(3) * &H100 + bytebuffer(0) * &H10000 + bytebuffer(1) * &H1000000
        rc = CLng(bytebuffer(0) + bytebuffer(1) * &H100)
        Lang_Charset_String = Hex(HexNumber)
        
        
        Do While Len(Lang_Charset_String) < 8
            Lang_Charset_String = "0" & Lang_Charset_String
        Loop
        
        strtemp = String(260, Asc(Syn_kg))
        rc = VerLanguageName(rc, strtemp, CLng(255))
        strFileVer(5) = StripTerminator(strtemp)
      
        strtemp = ""
        For i = 0 To 4
            Buffer = String(260, Asc(Syn_kg))
            strtemp = "\StringFileInfo\" & Lang_Charset_String & Syn_pzh & strFileVer(i)
            rc = VerQueryValue(sBuffer(0), strtemp, lVerPointer, lBufferLen)
            If rc <> 0 Then
                lstrcpy Buffer, lVerPointer
                Buffer = StripTerminator(Buffer)
            Else
                Buffer = ""
            End If
            strFileVer(i) = Buffer
        Next i
        GetFileVerInfo = strFileVer(0)
    End FunctionPrivate Sub Command1_Click()
        MsgBox GetFileVerInfo("C:\Program Files\Microsoft Office\Office\SELFCERT.exe")
    End Sub
    Public Function StripTerminator(ByVal sInput As String) As String
        Dim ZeroPos As Integer
        ZeroPos = InStr(1, sInput, vbNullChar)
        If ZeroPos > 0 Then
            StripTerminator = Left$(sInput, ZeroPos - 1)
        Else
            StripTerminator = sInput
        End If
    End Function
      

  2.   

    FileSyetemObject 
    里面全有了!
      

  3.   

    不用FileSyetemObject这样的控件绕道了,还是用我上边的API来实现吧,那是从根本上解决的