ファイルバージョン・製品バージョン取得 <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