プログラムにバージョン情報の設定ができるようになったら、アイコンも付けたいですよね。
Windowsでは、アイコンもバージョン情報同様、リソースとしてプログラムに付加することができます。
Windowsのファイルエクスプローラでプログラムファイルを右リリックでプロパティを表示します。[全般]タブを選択するとアイコンを確認することができます。
以下は、Project2.exeで自前のアイコンを定義していない場合と自前のアイコンを定義した場合の表示例です。
【アイコンリソースを定義していない場合のプロパティ】
自前のアイコンを定義しないとWindowsが持っている既定のアイコンが表示されます。Windowsの環境によってイメージは違うかもしれません。
【自前のアイコンリソースを定義してる場合のプロパティ】
以下が自前のアイコンイメージです。プロパティではこのアイコンが表示されています。
![]()
AppIcon1.ico として作成。
GUIプログラムでもCUIプログラムでも自前のアイコンを定義することができます。
プログラムのアイコンの設定について検索すると、よく出てくるのは、まずプログラムのショートカットを作成し、そのショートカットのプロパティで任意のアイコンと関連付けて表示させるというものだと思います。ここで紹介するのはショートカットではなくプログラム自身が自前のアイコンを持ち、プログラム自身のプロパティでそのアイコンを表示するというものです。まったく違うので注意してください。
LazarusのGUIを使用する場合とリソーススクリプトで定義する場合について紹介します。
Lazarusのメニュー[プロジェクト(P)]-[プロジェクトオプション...]で以下のウインドウを開き左の[アプリケーション]を選択します。
[アイコンを読み込む(L}]ボタンをクリックして用意したアイコンファイルを選択します。ここでは自作の「AppIcon1.ico」を選択しています。
[OK]ボタンをクリックすると設定内容がプロジェクト情報に保存されます。
[実行(R)]-[構築]でビルドするとEXEファイルに選択したアイコンが組み込まれます。CodeTyphon IDEでも同様です。
Lazarus IDEのGUIで設定する場合は以上で終わりです。
Lazarus IDEなどのGUIツールを使用しない場合はリソーススクリプトでアイコンリソースを定義します。ファイル名は任意でファイル拡張子は「.rc」です。
以下のIcon.rcはリソーススクリプトファイルの例です。上記のLazarus IDEで設定した内容と同じ情報をリソーススクリプトにしたものです。
コードページ UTF-8 で作成してください。
/////////////////////////////////////////////////////////////////////////////
//
// 本ファイルのコードページ
//
#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"の部分はアイコンファイル名です。パスを含むこともできます。
定義されたIcon.rcを組み込むプログラムの例です。コードページUTF-8で作成してください。
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}」を追加で指定することができます。内容に矛盾がなければリソースディレクティブは複数指定することができます。
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にした場合、以下のようになります。
/////////////////////////////////////////////////////////////////////////////
//
// ヘッダファイル 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で作成してください。
program Project2c;
{$MODE OBJFPC}{$H+}{$J-}
{$MINFPCONSTPREC 64}
{$CODEPAGE UTF8}
uses
SysUtils;
{$R MyResource.rc}
begin
SetMultiByteConversionCodePage(CP_UTF8);
SetMultiByteRTLFileSystemCodePage(CP_UTF8);
WriteLn('アプリアイコンとバージョン情報を設定したプログラムです。');
end.
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
無事にコンパイル、WindowsのファイルエクスプローラでProject2c.exeを右リリックでプロパティを表示し[全般]タブを選択すると、MyResource.rcで定義したアイコンを確認することができます。
さらに[詳細]タブを選択するとMyResource.rcで定義したバージョン情報の一部を確認することができます。
同じプログラムにアイコン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の"AppIcon.ico"になります。
これは、私が現状の動作を確認した結果です。
本記事のプログラムコードなどは以下のページでダウンロードできます。