Pascal 日和 ホームページ



更新:2026-01-03



備忘録インデックス

Object Pascal 備忘録  (Free Pascal OBJFPCモード)



バージョン情報を設定する


〜 Object Pascal(Free Pascal)のEXEやDLLファイルにバージョン情報を設定する方法 〜




1. はじめに


作成したプログラムを提出したり納品したり公開したりする場合、いったいどのプログラムを提供したのか、受領したファイルはどういうものなのかをファイルの情報から確認できるようにする必要があると思います。

プログラムを作成して、実行せずにそのプログラムファイルを識別するには、ファイルの名前、作成日付、サイズなど限定された情報になります。ファイルの名前は簡単に変更でき、作成日付も再ビルドするだけで変わってしまうので不十分だと思います。

Windowsでは、プログラムにバージョン情報リソースを付加することによりプログラムにバージョン情報や著作権情報などを設定することができます。

Windowsのファイルエクスプローラでプログラムファイルを右リリックでプロパティを表示します。[詳細]タブを選択するとバージョン情報リソースで定義した情報の一部を確認することができます。

以下は、Project1.exeでバージョン情報リソースを定義していない場合と定義した場合の表示例です。バージョン情報リソースの重要性がわかると思います。


【バージョン情報リソースを定義していない場合のプロパティ】


【バージョン情報リソースを定義した場合のプロパティ】


※ここで表示される情報はフィクションであり、実在の人物・団体とは一切関係ありません。




2. Windowsのリソースファイルとは


アイコン、ビットマップ、ダイアログボックステンプレートなどプログラムコード以外の情報(型はあらかじめ定義されている)をプログラム(EXE)やダイナミックリンクライブラリ(DLL)に読み込み専用データとして組み込んだものです。その中にバージョン情報リソースがあります。

一般的には、テキストファイルのリソーススクリプト(.rc)で記述しリソースコンパイラでバイナリのリソースファイル(.res)を生成し、EXEやDLLにリンクします。組み込まれたリソースはWin APIで参照することができます。

LazarusやCodeTyphonなどのIDEではIDEのGUIを使用してリソースの定義とリンクを行うことができます。




3. バージョン情報リソース


LazarusのGUIを使用する場合とリソーススクリプトで定義する場合について紹介します。


3.1 LazarusのIDEでバージョンリソースを設定する


Lazarusのメニュー[プロジェクト(P)]-[プロジェクトオプション...]で以下のウインドウを開き左の[バージョン情報]を選択します。


「実行ファイルにバージョン情報を含める」をチェックすると、その下の各設定値を編集できるようになります。

[OK]ボタンをクリックすると設定内容がプロジェクト情報に保存されます。

[実行(R)]-[構築]でビルドするとEXEファイルにバージョン情報リソースが組み込まれます。CodeTyphon IDEでも同様です。

Lazarus IDEのGUIで設定する場合は以上で終わりです。


設定項目の意味については以下のリンクを参照してください。バージョン情報のリソーススクリプトについても記載されています。


VERSIONINFO リソース


3.2 リソーススクリプトでバージョンリソースを設定する


Lazarus IDEなどのGUIツールを使用しない場合はリソーススクリプトでバージョン情報リソースを定義します。ファイル名は任意でファイル拡張子は「.rc」です。

以下のVerInfo.rcはリソーススクリプトファイルの例です。上記のLazarus IDEで設定した内容と同じ情報をリソーススクリプトにしたものです。

コードページ UTF-8 で作成してください。


 バージョン情報リソースファイルの例 : VerInfo.rc
/////////////////////////////////////////////////////////////////////////////
//
// ヘッダファイル 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


3.3 Free Pascal(Object Pascal)プログラムソースに定義したリソースを組み込む


定義されたVerInfo.rcを組み込むプログラムの例です。コードページUTF-8で作成してください。


 VerInfo.rcを組み込むプログラム例 : Project1.pas
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}を生成するので別の名前にしておくのがよいと思います。


3.4 プログラムをコンパイルする


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


3.5 プログラムを実行する


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


3.6 プログラムファイルのバージョン情報リソースを確認する


無事にコンパイル・実行できたら、WindowsのファイルエクスプローラでProject1.exeを右リリックでプロパティを表示し[詳細]タブを選択すると、バージョン情報リソースで定義した情報の一部を確認することができます。


LazarusやCodeTyphonのIDEでもプロジェクトオプションの[バージョン情報]で「□実行ファイルにバージョン情報を含める」をチェックせず、リソーススクリプトとリソースディレクティブを使用したバージョン情報リソースの設定をすることもできます。プロジェクトオプションとリソースディレクティブの両方でバージョン情報リソースを指定すると重複エラーになるので注意してください。




4. バージョン管理をしよう


プログラムを更新する際はバージョン情報リソースも必ず更新してください。

障害が発生した場合も、発生事象とプログラムのバージョンの関係を明確にすることが重要になります。

プログラムソースもGitなどの構成管理システムでバージョン管理を行い、リリースバージョン毎にタグを設定するなど、提供したプログラムの各バージョンをいつでも再構築できるようにしておくことも重要です。




5. ダウンロード


本記事のプログラムコードなどは以下のページでダウンロードできます。


Object Pascal 備忘録




6. 参照


Free Pascal コンパイル環境



[ライセンスについて]