Pascal 日和 ホームページ



更新:2026-01-03



備忘録インデックス

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



アプリのアイコンを設定する


〜 Object Pascal(Free Pascal)のEXEやDLLファイルにアイコンを設定する方法 〜




1. はじめに


プログラムにバージョン情報の設定ができるようになったら、アイコンも付けたいですよね。

Windowsでは、アイコンもバージョン情報同様、リソースとしてプログラムに付加することができます。

Windowsのファイルエクスプローラでプログラムファイルを右リリックでプロパティを表示します。[全般]タブを選択するとアイコンを確認することができます。

以下は、Project2.exeで自前のアイコンを定義していない場合と自前のアイコンを定義した場合の表示例です。


【アイコンリソースを定義していない場合のプロパティ】


自前のアイコンを定義しないとWindowsが持っている既定のアイコンが表示されます。Windowsの環境によってイメージは違うかもしれません。


【自前のアイコンリソースを定義してる場合のプロパティ】


以下が自前のアイコンイメージです。プロパティではこのアイコンが表示されています。


  

AppIcon1.ico として作成。


GUIプログラムでもCUIプログラムでも自前のアイコンを定義することができます。


プログラムのアイコンの設定について検索すると、よく出てくるのは、まずプログラムのショートカットを作成し、そのショートカットのプロパティで任意のアイコンと関連付けて表示させるというものだと思います。ここで紹介するのはショートカットではなくプログラム自身が自前のアイコンを持ち、プログラム自身のプロパティでそのアイコンを表示するというものです。まったく違うので注意してください。




2. アイコンリソース


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


2.1 LazarusのIDEでアイコンを設定する


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


[アイコンを読み込む(L}]ボタンをクリックして用意したアイコンファイルを選択します。ここでは自作の「AppIcon1.ico」を選択しています。

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

[実行(R)]-[構築]でビルドするとEXEファイルに選択したアイコンが組み込まれます。CodeTyphon IDEでも同様です。

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


2.2 リソーススクリプトでアイコンリソースを設定する


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

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

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

 アイコンリソースファイルの例 : Icon.rc
/////////////////////////////////////////////////////////////////////////////
//
// 本ファイルのコードページ
//

#pragma code_page(65001)    // Free Pascalの{$CODEPAGE UTF8}と同じようなもの。

/////////////////////////////////////////////////////////////////////////////
//
// アイコン
//

APPICON ICON   "AppIcon1.ico"


必要なのは13行目の「APPICON ICON  "AppIcon1.ico"」だけです。その場合は6行目の「#pragma code_page(65001)」は特に必要としませんが、アイコンファイル名に日本語を使用して"アプリアイコン.ico"のようにした場合はコードページの指定が必要になります。

"APPICON"の部分はアイコンIDです。アイコンIDは任意の識別子または数値です。"ICON"はキーワードでアイコンリソースを示します。"AppIcon.ico"の部分はアイコンファイル名です。パスを含むこともできます。


2.3 プログラムソースに定義したリソースを組み込む


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


 Icon.rcを組み込むプログラム例 : Project2a.pas
program Project2a;

{$MODE OBJFPC}{$H+}{$J-}
{$MINFPCONSTPREC 64}
{$CODEPAGE UTF8}

uses
  SysUtils;

{$R Icon.rc}

begin

  SetMultiByteConversionCodePage(CP_UTF8);
  SetMultiByteRTLFileSystemCodePage(CP_UTF8);

  WriteLn('アプリアイコンを設定したプログラムです。');

end.


前回のバージョン情報の設定も組み込む場合は「{$R VerInfo.rc}」を追加で指定することができます。内容に矛盾がなければリソースディレクティブは複数指定することができます。


 Icon.rcとVerInfo.rcを組み込むプログラム例 : Project2b.pas
program Project2b;

{$MODE OBJFPC}{$H+}{$J-}
{$MINFPCONSTPREC 64}
{$CODEPAGE UTF8}

uses
  SysUtils;

{$R Icon.rc}
{$R VerInfo.rc}

begin

  SetMultiByteConversionCodePage(CP_UTF8);
  SetMultiByteRTLFileSystemCodePage(CP_UTF8);

  WriteLn('アプリアイコンとバージョン情報を設定したプログラムです。');

end.


Windowsのリソースにはアイコンやバージョン情報以外にもいろいろあるので、リソーススクリプトをばらばらに作成するのではなく一つにまとめて作成するのが一般的です。分けて悪いわけではありません。

Icon.rcとVerInfo.rcをマージしてMyResource.rcにした場合、以下のようになります。


 リソースファイルの例 : MyResource.rc
/////////////////////////////////////////////////////////////////////////////
//
// ヘッダファイル windres.h のインクルード
//

#include "windres.h"

/////////////////////////////////////////////////////////////////////////////
//
// 本ファイルのコードページ
//

#pragma code_page(65001)    // Free Pascalの{$CODEPAGE UTF8}と同じようなもの。

/////////////////////////////////////////////////////////////////////////////
//
// リソースの言語(日本語リソース)
//

LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT

/////////////////////////////////////////////////////////////////////////////
//
// アイコン
//

APPICON ICON   "AppIcon1.ico"

/////////////////////////////////////////////////////////////////////////////
//
// バージョン情報データ (この値を編集する) ※変数は任意の名前で作成したもの。
//
// この情報データはフィクションであり、実在の人物・団体とは一切関係ありません。
//

#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      "Project2c"                // 内部名
#define VER_LEGALCOPYRIGHT_STR    "©2025 CHOURIKI-SOFT Inc." // 著作権表示
#define VER_LEGALTRADEMARKS_STR   ""                         // 商標/登録商標
#define VER_ORIGINALFILENAME_STR  "Project2c.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


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


 MyResource.rcを組み込むプログラム例 : Project2c.pas
program Project2c;

{$MODE OBJFPC}{$H+}{$J-}
{$MINFPCONSTPREC 64}
{$CODEPAGE UTF8}

uses
  SysUtils;

{$R MyResource.rc}

begin

  SetMultiByteConversionCodePage(CP_UTF8);
  SetMultiByteRTLFileSystemCodePage(CP_UTF8);

  WriteLn('アプリアイコンとバージョン情報を設定したプログラムです。');

end.


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


fpc.exeでProject2c.pasをコンパイルすると「MyResource.rc」ファイルが処理されていることがわかります。


C:\PG\FreePascal\Project2>fpc -Twin64 -Px86_64 Project2c.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 Project2c.pas
Compiling resource C:\PG\FreePascal\Project2\MyResource.rc
Compiling resource Project2c.obj Linking Project2c.exe
18 lines compiled, 0.2 sec, 72752 bytes code, 5252 bytes data


2.5 プログラムファイルのアイコンを確認する


無事にコンパイル、WindowsのファイルエクスプローラでProject2c.exeを右リリックでプロパティを表示し[全般]タブを選択すると、MyResource.rcで定義したアイコンを確認することができます。


さらに[詳細]タブを選択するとMyResource.rcで定義したバージョン情報の一部を確認することができます。




3. 複数のアイコンリソースを定義したらどうなる?


同じプログラムにアイコンIDを変えて複数のアイコンを組み込むことができます。それぞれのアイコンはプログラム内からWindows APIで個別にアクセスできます。

では、このときどのアイコンがプロパティで表示されるプログラムのメインアイコンになるのでしょうか? 気になりますね。

明確な仕様は見つけられませんでしたが、確かリソース中の最初のアイコンがメインアイコンになるという話を以前見た記憶があります。現状の動作で確認してみたところ、確かに最初のアイコンがメインアイコンになっているようです。

最初のアイコンとは、リソーススクリプトの記述順序ではなく、実際にコンパイルされバイナリのリソースになったものの中の最初のアイコンです。

その順序はアイコンIDでソートされています。アイコンIDが識別子の場合はアルファベットの昇順で数値の場合は数値の昇順です。また 識別子 < 数値 です。

リソーススクリプトで以下の順で記述した場合、


/////////////////////////////////////////////////////////////////////////////
//
// アイコン
//
201       ICON  "Icon201.ico"
MAINICON  ICON  "MainIcon.ico"
101       ICON  "Icon101.ico"
_APPICON  ICON  "_AppIcon.ico"
APPICON   ICON  "AppIcon.ico"
TOOLICON  ICON  "ToolIcon.ico"


コンパイルされたリソース内のアイコン格納順序は定義の順序とは関係なく以下のようになります。


  1. APPICON
  2. MAINICON
  3. TOOLICON
  4. _APPICON
  5. 101
  6. 201


そのためプログラムのメインアイコンは1番目のAPPICONの"AppIcon.ico"になります。

これは、私が現状の動作を確認した結果です。




4. ダウンロード


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


Object Pascal 備忘録




5. 参照


Free Pascal コンパイル環境



[ライセンスについて]