ファイルバージョン・製品バージョン取得          <TOP>


ファイルバージョンと製品バージョンを取得します。

GetFileVersionInfo ファイルに関するバージョン情報を取得

GetFileVersionInfoSize ファイルからバージョン情報を取得できるかどうかを判定

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

RtlMoveMemory ある位置から別の位置にメモリブロックを移動

 

初期状態では、既知のnotepad.exeファイルパスをしていしています。ファイル名欄に、フルパスを指定し『取得』ボタンをクリックするとファイルバージョンおよび製品バージョンが表示されます。

EXCELを指定してみました。

プロパティで確認

 

'================================================================
'= ファイル・製品バージョン取得
'=    (GetFileVersionInfo.bas)
'================================================================
#include "Windows.bi"

Type VS_FIXEDFILEINFO
    dwSignature        As Long
    dwStrucVersion     As Long
    dwFileVersionMS    As Long
    dwFileVersionLS    As Long
    dwProductVersionMS As Long
    dwProductVersionLS As Long
    dwFileFlagsMask    As Long
    dwFileFlags        As Long
    dwFileOS           As Long
    dwFileType         As Long
    dwFileSubType      As Long
    dwFileDateMS       As Long
    dwFileDateLS       As Long
End Type

' ファイルに関するバージョン情報を取得
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&)

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

Var Shared Edit1 As Object
Var Shared Text(4) As Object
Var Shared Button1 As Object

Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
For i = 0 To 4
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
Next i

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var FileName As String
    Var SizeVerInfo As Long
    Var DmyHandle As Long
    Var PtrVerInfo As Long
    Var LenVerInfo As Long
    Var FileInfo As VS_FIXEDFILEINFO
    Var FileVersion As String
    Var ProductVersion As String
    Var Ret As Long

    FileName = GetDlgItemText("Edit1")                            '対象ファイルを設定
    SizeVerInfo = Api_GetFileVersionInfoSize(FileName, DmyHandle) 'バージョン情報のサイズを取得
    If SizeVerInfo > 0 Then                                       'バージョン情報のサイズを取得成功
        Var DmyVerInfo(SizeVerInfo - 1)                           'ダミー変数の領域を確保
        Ret = Api_GetFileVersionInfo(FileName, 0, SizeVerInfo, DmyVerInfo(0)) 'バージョン情報を取得
        Ret = Api_VerQueryValue(DmyVerInfo(0), "\", PtrVerInfo, LenVerInfo)   'バージョン情報リソースのルートブロックを取得
        MoveMemory FileInfo, ByVal PtrVerInfo, Len(FileInfo)                  '取得したルートブロックをバージョン情報の構造体へ移動

        'ファイルバージョンを取り出し
        FileVersion = Str$((FileInfo.dwFileVersionMS \ 2 ^ 16) And &HFFFF) & "." & Str$(FileInfo.dwFileVersionMS And &HFFFF) & "." & Str$((FileInfo.dwFileVersionLS \ 2 ^ 16) And &HFFFF) & "." & Str$(FileInfo.dwFileVersionLS And &HFFFF)

        '製品バージョンを取り出し
        ProductVersion = Str$((FileInfo.dwProductVersionMS \ 2 ^ 16) And &HFFFF) & "." & Str$(FileInfo.dwProductVersionMS And &HFFFF) & "." & Str$((FileInfo.dwProductVersionLS \ 2 ^ 16) And &HFFFF) & "." & Str$(FileInfo.dwProductVersionLS And &HFFFF)
        Text(3).SetWindowText FileVersion                         'ファイルバージョンを表示
        Text(4).SetWindowText ProductVersion                      '製品バージョンを表示
    Else                                                          'バージョン情報のサイズを取得失敗
        Text(3).SetWindowText "取得できません。"
        Text(4).SetWindowText "取得できません。"
    End If
End Sub

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