バージョン情報リソースから選択された情報を取得          <TOP>


GetFileVersionInfo ファイルに関するバージョン情報を取得
GetFileVersionInfoSize ファイル内のバージョン情報のサイズを取得
VerQueryValue バージョン情報リソースから選択されたバージョン情報を取得
GetSystemDirectory Windows のシステムディレクトリのパスを取得
MoveMemory メモリの指定領域をコピー
 
EditBoxに、ファイルをドラッグ&ドロップしファイルの情報を得ています。
 

'================================================================
'= バージョン情報リソースから選択された情報を取得
'=    (VerQueryValue.bas)
'================================================================
#include "Windows.bi"

' ファイルに関するバージョン情報を取得
Declare Function Api_GetFileVersionInfo& Lib "Version" Alias "GetFileVersionInfoA" (ByVal lptstrFilename$, ByVal dwhandle&, ByVal dwlen&, lpData As Any)

' ファイル内のバージョン情報のサイズを取得
Declare Function Api_GetFileVersionInfoSize& Lib "Version" Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename$, lpdwHandle&)

' バージョン情報リソースから選択されたバージョン情報を取得
Declare Function Api_VerQueryValue& Lib "Version" Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock$, lplpBuffer As Any, puLen&)

' Windows のシステムディレクトリのパスを取得。システムディレクトリには、Windows ライブラリ、ドライバなどのファイルが置かれている
Declare Function Api_GetSystemDirectory& Lib "Kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer$, ByVal nSize&)

' メモリの指定領域をコピー
Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, ByVal Source&, ByVal Length&)

Type VS_FIXEDFILEINFO
    dwSignature         As Long
    dwStrucVersionl     As Integer
    dwStrucVersionh     As Integer
    dwFileVersionMSl    As Integer
    dwFileVersionMSh    As Integer
    dwFileVersionLSl    As Integer
    dwFileVersionLSh    As Integer
    dwProductVersionMSl As Integer
    dwProductVersionMSh As Integer
    dwProductVersionLSl As Integer
    dwProductVersionLSh As Integer
    dwFileFlagsMask     As Long
    dwFileFlags         As Long
    dwFileOS            As Long
    dwFileType          As Long
    dwFileSubtype       As Long
    dwFileDateMS        As Long
    dwFileDateLS        As Long
End Type

#define VS_FFI_FILEFLAGSMASK &H3F       '
#define VS_FFI_SIGNATURE &HFEEF04BD     '構造体の識別子
#define VS_FFI_STRUCVERSION &H10000     '構造体のバイナリバージョン番号0x00000029以上の値

#define VS_FF_DEBUG &H1                 'デバッグ情報が含まれている
#define VS_FF_INFOINFERRED &H10         '構造体は動的に作成されている
#define VS_FF_PATCHED &H4               'ファイルは修正されたバージョン
#define VS_FF_PRERELEASE &H2            'ファイルは開発バージョン
#define VS_FF_PRIVATEBUILD &H8          '標準的なリリースされたファイルではない
#define VS_FF_SPECIALBUILD &H20         '標準ファイルのバリエーション

#define VOS__BASE &H0                   '
#define VOS__PM16 &H2                   '
#define VOS__PM32 &H3                   '
#define VOS__WINDOWS16 &H1              '
#define VOS__WINDOWS32 &H4              '
#define VOS_DOS &H10000                 'MS-DOS
#define VOS_DOS_WINDOWS16 &H10001       'in16
#define VOS_DOS_WINDOWS32 &H10004       'Win32s
#define VOS_NT &H40000                  'WindowsNT
#define VOS_NT_WINDOWS32 &H40004        '設計対象となったOS
#define VOS_OS216 &H20000               'OS/2 16ビット
#define VOS_OS216_PM16 &H20002          '
#define VOS_OS232 &H30000               'OS/2 32ビット
#define VOS_OS232_PM32 &H30003          '
#define VOS_UNKNOWN &H0                 '

#define VFT_APP &H1                     'アプリケーション
#define VFT_DLL &H2                     'ダイナミックリンクライブラリ
#define VFT_DRV &H3                     'デバイスドライバ
#define VFT_FONT &H4                    'フォント
#define VFT_STATIC_LIB &H7              'スタティックリンクライブラリ
#define VFT_UNKNOWN &H0                 '
#define VFT_VXD &H5                     '仮想デバイス

#define VFT2_DRV_COMM &HA               '
#define VFT2_DRV_DISPLAY &H4            'ディスプレイドライバ
#define VFT2_DRV_INSTALLABLE &H8        'インストール可能なドライバ
#define VFT2_DRV_KEYBOARD &H2           'キーボードドライバ
#define VFT2_DRV_LANGUAGE &H3           '言語ドライバ
#define VFT2_DRV_MOUSE &H5              'マウスドライバ
#define VFT2_DRV_NETWORK &H6            'ネットワークドライバ
#define VFT2_DRV_PRINTER &H1            'プリンタドライバ
#define VFT2_DRV_SOUND &H9              'サウンドドライバ
#define VFT2_DRV_SYSTEM &H7             'ファイルはシステムドライバ
#define VFT2_UNKNOWN &H0                '

#define VFT2_FONT_RASTER &H1            'ラスタフォント
#define VFT2_FONT_VECTOR &H2            'ベクタフォント
#define VFT2_FONT_TRUETYPE &H3          'TrueTypeフォント

#define MAX_PATH 260

Var Shared Edit1 As Object
Var Shared List1 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 12
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14 : List1.SetWindowSize 274, 104

Var Shared sPath As String

'================================================================
'=
'================================================================
Declare Sub DisplayVerInfo(FilePath As String)
Sub DisplayVerInfo(FilePath As String)
    Var SVer As String
    Var FVer As String
    Var PVer As String
    Var F As String
    Var Typ As String
    Var STyp As String
    Var OS As String
    Var l As Long
    Var BuffL As Long
    Var Pointer As Long
    Var VERSION As VS_FIXEDFILEINFO
    Var Ret As LOng
 
    List1.ResetContent

    l = Api_GetFileVersionInfoSize(FilePath, 0)
    If l < 1 Then
        A% = MessageBox("", "情報を取得できません!", 0, 2)
    Else
        Var Buff(l) As Byte
        Ret = Api_GetFileVersionInfo(FilePath, 0, l, Buff(0))
        Ret = Api_VerQueryValue(Buff(0), "\", Pointer, BuffL)
        MoveMemory VERSION, Pointer, Len(VERSION)
      
        SVer = Format$(VERSION.dwStrucVersionh) & "." & Format$(VERSION.dwStrucVersionl)
        
        FVer = Format$(VERSION.dwFileVersionMSh) & "." & Format$(VERSION.dwFileVersionMSl) & "." & Format$(VERSION.dwFileVersionLSh) & "." & Format$(VERSION.dwFileVersionLSl)
        
        PVer = Format$(VERSION.dwProductVersionMSh) & "." & Format$(VERSION.dwProductVersionMSl) & "." & Format$(VERSION.dwProductVersionLSh) & "." & Format$(VERSION.dwProductVersionLSl)
  
        If VERSION.dwFileFlags And VS_FF_DEBUG Then F = "Debug "
        If VERSION.dwFileFlags And VS_FF_PRERELEASE Then F = F & "PreRel "
        If VERSION.dwFileFlags And VS_FF_PATCHED Then F = F & "Patched "
        If VERSION.dwFileFlags And VS_FF_PRIVATEBUILD Then F = F & "Private "
        If VERSION.dwFileFlags And VS_FF_INFOINFERRED Then F = F & "Info "
        If VERSION.dwFileFlags And VS_FF_SPECIALBUILD Then F = F & "Special "
        If VERSION.dwFileFlags And VFT2_UNKNOWN Then F = F & "Unknown "
      
        Select Case VERSION.dwFileOS
            Case VOS_DOS_WINDOWS16
                OS = "DOS-Win16"
            Case VOS_DOS_WINDOWS32
                OS = "DOS-Win32"
            Case VOS_OS216_PM16
                OS = "OS/2-16 PM-16"
            Case VOS_OS232_PM32
                OS = "OS/2-16 PM-32"
            Case VOS_NT_WINDOWS32
                OS = "NT-Win32"
            Case Else
                OS = "Unknown"
        End Select
      
        Select Case VERSION.dwFileType
            Case VFT_APP
                Typ = "App"
            Case VFT_DLL
                Typ = "DLL"
            Case VFT_DRV
                Typ = "Driver"
                Select Case VERSION.dwFileSubtype
                    Case VFT2_DRV_PRINTER
                        STyp = "Printer drv"
                    Case VFT2_DRV_KEYBOARD
                        STyp = "Keyboard drv"
                    Case VFT2_DRV_LANGUAGE
                        STyp = "Language drv"
                    Case VFT2_DRV_DISPLAY
                        STyp = "Display drv"
                    Case VFT2_DRV_MOUSE
                        STyp = "Mouse drv"
                    Case VFT2_DRV_NETWORK
                        STyp = "Network drv"
                    Case VFT2_DRV_SYSTEM
                        STyp = "System drv"
                    Case VFT2_DRV_INSTALLABLE
                        STyp = "Installable"
                    Case VFT2_DRV_SOUND
                        STyp = "Sound drv"
                    Case VFT2_DRV_COMM
                        STyp = "Comm drv"
                    Case VFT2_UNKNOWN
                        STyp = "Unknown"
                End Select
            Case VFT_FONT
                Typ = "Font"
                Select Case VERSION.dwFileSubtype
                    Case VFT2_FONT_RASTER
                        STyp = "Raster Font"
                    Case VFT2_FONT_VECTOR
                        STyp = "Vector Font"
                    Case VFT2_FONT_TRUETYPE
                        STyp = "TrueType Font"
                End Select
            Case VFT_VXD
                Typ = "VxD"
            Case VFT_STATIC_LIB
                Typ = "Lib"
            Case Else
                Typ = "Unknown"
          End Select
    End If
    
    List1.AddString "Structure Version:" & SVer
    List1.AddString "File Version     :" & FVer
    List1.AddString "Product Version  :" & PVer
    List1.AddString "Flags            :" & F
    List1.AddString "OS               :" & OS
    List1.AddString "File Type        :" & Typ
    List1.AddString "File Sub Type    :" & STyp
End Sub

'================================================================
'=
'================================================================
Declare Sub Edit1_Change edecl ()
Sub Edit1_Change()
    Var Ret As Long

    DisplayVerInfo sPath
End Sub

'================================================================
'= シェルドロップされたファイル名を取得
'================================================================
Declare Sub Edit1_DropFiles edecl (ByVal DF As Long)
Sub Edit1_DropFiles(ByVal DF As Long)
    Var Ret As Long

    Ret = GetDropFileCount(DF)
    sPath = GetDropFileName(DF, 0)
    Edit1.SetWindowText sPath
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End