作成したプログラムを提出したり納品したり公開したりする場合、いったいどのプログラムを提供したのか、受領したファイルはどういうものなのかをファイルの情報から確認できるようにする必要があると思います。
プログラムを作成して、実行せずにそのプログラムファイルを識別するには、ファイルの名前、作成日付、サイズなど限定された情報になります。ファイルの名前は簡単に変更でき、作成日付も再ビルドするだけで変わってしまうので不十分だと思います。
Windowsでは、プログラムにバージョン情報リソースを付加することによりプログラムにバージョン情報や著作権情報などを設定することができます。
Windowsのファイルエクスプローラでプログラムファイルを右リリックでプロパティを表示します。[詳細]タブを選択するとバージョン情報リソースで定義した情報の一部を確認することができます。
以下は、Project1.exeでバージョン情報リソースを定義していない場合と定義した場合の表示例です。バージョン情報リソースの重要性がわかると思います。
【バージョン情報リソースを定義していない場合のプロパティ】
【バージョン情報リソースを定義した場合のプロパティ】
※ここで表示される情報はフィクションであり、実在の人物・団体とは一切関係ありません。
アイコン、ビットマップ、ダイアログボックステンプレートなどプログラムコード以外の情報(型はあらかじめ定義されている)をプログラム(EXE)やダイナミックリンクライブラリ(DLL)に読み込み専用データとして組み込んだものです。その中にバージョン情報リソースがあります。
一般的には、テキストファイルのリソーススクリプト(.rc)で記述しリソースコンパイラでバイナリのリソースファイル(.res)を生成し、EXEやDLLにリンクします。組み込まれたリソースはWin APIで参照することができます。
LazarusやCodeTyphonなどのIDEではIDEのGUIを使用してリソースの定義とリンクを行うことができます。
LazarusのGUIを使用する場合とリソーススクリプトで定義する場合について紹介します。
Lazarusのメニュー[プロジェクト(P)]-[プロジェクトオプション...]で以下のウインドウを開き左の[バージョン情報]を選択します。
「実行ファイルにバージョン情報を含める」をチェックすると、その下の各設定値を編集できるようになります。
[OK]ボタンをクリックすると設定内容がプロジェクト情報に保存されます。
[実行(R)]-[構築]でビルドするとEXEファイルにバージョン情報リソースが組み込まれます。CodeTyphon IDEでも同様です。
Lazarus IDEのGUIで設定する場合は以上で終わりです。
設定項目の意味については以下のリンクを参照してください。バージョン情報のリソーススクリプトについても記載されています。
Lazarus IDEなどのGUIツールを使用しない場合はリソーススクリプトでバージョン情報リソースを定義します。ファイル名は任意でファイル拡張子は「.rc」です。
以下のVerInfo.rcはリソーススクリプトファイルの例です。上記のLazarus IDEで設定した内容と同じ情報をリソーススクリプトにしたものです。
コードページ UTF-8 で作成してください。
/////////////////////////////////////////////////////////////////////////////
//
// ヘッダファイル windres.h のインクルード
//
#include "windres.h"
/////////////////////////////////////////////////////////////////////////////
//
// 本ファイルのコードページ
//
#pragma code_page(65001) // Free Pascalの{$CODEPAGE UTF8}と同じようなもの。
/////////////////////////////////////////////////////////////////////////////
//
// リソースの言語(日本語リソース)
//
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
/////////////////////////////////////////////////////////////////////////////
//
// バージョン情報データ (この値を編集する) ※変数は任意の名前で作成したもの。
//
// この情報データはフィクションであり、実在の人物・団体とは一切関係ありません。
//
#define VER_FILEVERSION 1,0,0,1 // ファイルバージョン
#define VER_FILEVERSION_STR "1.0.0.1" // ファイルバージョン(文字列)
#define VER_PRODUCTVERSION 1,0,0,0 // 製品バージョン
#define VER_PRODUCTVERSION_STR "1.0.0" // 製品バージョン(文字列)
#define VS_FFI_FILEFLAGSMASK 0x3FL // ファイルフラグマスク
#define VER_FFLAGS 0L // ファイルフラグ
#define VER_FILETYPE VFT_APP // アプリ(EXE)。DLLの場合VFT_DLL
#define VER_COMPANYNAME_STR "超力ソフト" // 会社名
#define VER_FILEDESCRIPTION_STR "ObjectPascalプログラム" // ファイルの説明
#define VER_INTERNALNAME_STR "Project1" // 内部名
#define VER_LEGALCOPYRIGHT_STR "©2025 CHOURIKI-SOFT Inc." // 著作権表示
#define VER_LEGALTRADEMARKS_STR "" // 商標/登録商標
#define VER_ORIGINALFILENAME_STR "Project1.exe" // オリジナル名
#define VER_PRODUCTNAME_STR "超力アプリ" // 製品名
#define VER_COMMENTS_STR "バージョン情報テスト" // 追加情報
/////////////////////////////////////////////////////////////////////////////
//
// バージョン情報定義
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS VER_FFLAGS
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041104B0" // 0x0411(日本語), 0x04B0(=1200 ユニコード)
BEGIN
VALUE "CompanyName", VER_COMPANYNAME_STR
VALUE "FileDescription", VER_FILEDESCRIPTION_STR
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", VER_INTERNALNAME_STR
VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR
VALUE "LegalTrademarks", VER_LEGALTRADEMARKS_STR
VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
VALUE "ProductName", VER_PRODUCTNAME_STR
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
VALUE "Comments", VER_COMMENTS_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x411, 1200 // 日本語, ユニコード
END
END
日本語を前提とした定義としています。
そのためのポイントとしては、以下の3つです。
スクリプトファイルはUTF-8(コードページ65001)で記述する。(13行目)
コンパイルされたリソースデータはユニコード(コードページ1200)となるようにする。(65行目,81行目)
言語設定は日本語とする。(20行目,65行目,81行目)
これで漢字の他、"©"などの特殊文字もUTF-8でリソーススクリプトに記述することができ、バイナリのリソースデータ中にも保存可能となります。
ダイナミックリンクライブラリ(DLL)の場合は60行目を以下のように設定するのかもしれませんがこの設定がどう有効なのかはよくわかりません。上記のままでも変更してもDLLのバージョン情報リソースは設定できます。合わせておくのが無難ですかね。
FILETYPE VFT_DLL
定義されたVerInfo.rcを組み込むプログラムの例です。コードページUTF-8で作成してください。
program Project1;
{$MODE OBJFPC}{$H+}{$J-}
{$MINFPCONSTPREC 64}
{$CODEPAGE UTF8}
uses
SysUtils, FileInfo;
var
VerInfo : TVersionInfo;
FileVerInfo : TFileVersionInfo;
{$R VerInfo.rc}
begin
SetMultiByteConversionCodePage(CP_UTF8);
SetMultiByteRTLFileSystemCodePage(CP_UTF8);
try
VerInfo := TVersionInfo.Create; // 「FILEVERSION」の情報。
FileVerInfo := TFileVersionInfo.Create(Nil); // 「BLOCK "StringFileInfo"」の情報。
try
VerInfo.Load(HINSTANCE); // バージョン情報リソースがないと例外が発生する。
except
WriteLn;
WriteLn('エラー: バージョン情報がありません。');
ExitCode := 1;
Exit;
end;
WriteLn;
{ 「FILEVERSION」の情報を出力 }
with VerInfo.FixedInfo do
begin
WriteLn(
ExtractFileName(ParamStr(0)), ' Ver.',
FileVersion[0], '.',
FileVersion[1], '.',
FileVersion[2], '.',
FileVersion[3]
);
end;
WriteLn;;
{ 「BLOCK "StringFileInfo"」の情報を出力 }
FileVerInfo.ReadFileInfo;
with FileVerInfo.VersionStrings do
begin
WriteLn('Company : ', Values['CompanyName']);
WriteLn('File description : ', Values['FileDescription']);
WriteLn('File version : ', Values['FileVersion']);
WriteLn('Internal name : ', Values['InternalName']);
WriteLn('Legal copyright : ', Values['LegalCopyright']);
WriteLn('Legal trademarks : ', Values['LegalTrademarks']);
WriteLn('Original filename : ', Values['OriginalFilename']);
WriteLn('Product name : ', Values['ProductName']);
WriteLn('Product version : ', Values['ProductVersion']);
WriteLn('Comments : ', Values['Comments']);
end;
WriteLn;
finally
FileVerInfo.Free;
VerInfo.Free;
end;
end.
プログラム(EXE)やダイナミックリンクライブラリ(DLL)にリソースを組み込むにはprogramやlibraryのソースファイルにリソースディレクティブ「{$R ファイル名}」を設定するだけです。
{$R VerInfo.rc}
ファイル名の既定の拡張子は「.res」でバイナリリソースですが、「.rc」にすることによりリソーススクリプトを指定することもできます。ここではリソーススクリプトファイルVerInfo.rcを指定しています。
Free Pascalコンパイラはリソースディレクティブがあると、自動的に組み込む処理を行います。特にコンパイラオプションを追加するなどの必要もありません。バイナリリソース「.res」の場合はリンクし、リソーススクリプト「.rc」の場合は、リソーススクリプトをコンパイルしてバイナリリソースにしてからリンクします。
ファイル名の指定で「*」を使用した{$R *.rc}や{$R *.res}という記述方法があります。これは、リソースファイル名がプログラムのソースファイル名と同じ場合に使用できます。つまり、プログラムソースファイルがProject1.pasでリソースファイルがProject1.rcやProject1.resの場合などです。ただし、LazarusやCodeTyphonの場合はIDEが{$R *.res}を生成するので別の名前にしておくのがよいと思います。
fpc.exeでProject1.pasをコンパイルすると「VerInfo.rc」ファイルが処理されていることがわかります。
C:\PG\FreePascal\Project1>fpc -Twin64 -Px86_64 Project1.pas
Free Pascal Compiler version 3.2.2 [2021/05/15] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling Project1.pas
Compiling resource C:\PG\FreePascal\Project1\VerInfo.rc
Compiling resource Project1.obj
Linking Project1.exe
57 lines compiled, 0.2 sec, 214800 bytes code, 10308 bytes data
Project1.exeを実行してみます。プログラムで自分に組み込まれたバージョン情報リソースを読み込んで表示します。
コマンドプロンプトがシフトJIS(コードページ932)だと「c」が表示できないので「chcp」コマンドでUTF-8(コードページ65001)に変更してから実行します。
C:\PG\FreePascal\Project1>chcp 65001
Active code page: 65001
C:\PG\FreePascal\Project1>Project1.exe
Project1.exe Ver.1.0.0.1
Company : 超力ソフト
File description : ObjectPascalプログラム
File version : 1.0.0.1
Internal name : Project1
Legal copyright : ©2025 CHOURIKI-SOFT Inc.
Legal trademarks :
Original filename : Project1.exe
Product name : 超力アプリ
Product version : 1.0.0
Comments : バージョン情報テスト
コマンドプロンプトのコードページをシフトJISに戻すには再度「chcp」コマンドでシフトJIS(コードページ932)に変更します。
C:\PG\FreePascal\Project1>chcp 932
現在のコード ページ: 932
無事にコンパイル・実行できたら、WindowsのファイルエクスプローラでProject1.exeを右リリックでプロパティを表示し[詳細]タブを選択すると、バージョン情報リソースで定義した情報の一部を確認することができます。
LazarusやCodeTyphonのIDEでもプロジェクトオプションの[バージョン情報]で「□実行ファイルにバージョン情報を含める」をチェックせず、リソーススクリプトとリソースディレクティブを使用したバージョン情報リソースの設定をすることもできます。プロジェクトオプションとリソースディレクティブの両方でバージョン情報リソースを指定すると重複エラーになるので注意してください。
プログラムを更新する際はバージョン情報リソースも必ず更新してください。
障害が発生した場合も、発生事象とプログラムのバージョンの関係を明確にすることが重要になります。
プログラムソースもGitなどの構成管理システムでバージョン管理を行い、リリースバージョン毎にタグを設定するなど、提供したプログラムの各バージョンをいつでも再構築できるようにしておくことも重要です。
本記事のプログラムコードなどは以下のページでダウンロードできます。