2026/01/28(水) [n年前の日記]
#1 [lazarus] Lazarusで作ったアプリにSTRINGTABLEを含めたい
Windows11 x64 25H2 + Lazarus 4.4 で作成したWindows用スクリーンセーバに、リソースファイルを含めたい。
リソースファイル内の STRINGTABLE にスクリーンセーバ名を記述してバイナリに含めてしまうことで、「スクリーンセーバーの変更」ウインドウのリスト上に表示される名前を指定できるはず。
Delphiなら、.rc ファイルをテキストファイルとして書いて、リソースを追加することで含めてくれるのだけど…。Lazarus ではどうすればいいのやら。
リソースファイル内の STRINGTABLE にスクリーンセーバ名を記述してバイナリに含めてしまうことで、「スクリーンセーバーの変更」ウインドウのリスト上に表示される名前を指定できるはず。
Delphiなら、.rc ファイルをテキストファイルとして書いて、リソースを追加することで含めてくれるのだけど…。Lazarus ではどうすればいいのやら。
◎ windresでresに変換 :
AI(Google Gemini)に尋ねてみたら、windres を使って .rc を .res に変換しろと言ってきた。
windres はFPC (Free Pascal)に同梱されている。自分の環境では、D:\Dev\lazarus\ に Lazarus をインストールしてあるので、以下にFPC(とwindres)が入ってる。
DOS窓上で FPC が使えるようにするためのbatファイル、D:\home2\bin\fpcenable.bat を作成しておいた。とメモ。実行すると環境変数PATHの先頭にFPCのパスが追加されて、FPCに同梱されたアレコレが利用できるようになる。
リソースファイル(リソーススクリプトファイル) strings.rc を作成。中身は以下。スクリーンセーバ名を記述してる。
windres で .rc を .res に変換。
.lpr にリソースファイル strings.res を読み込むように記述を追加。
この状態でビルドして、出来上がった .scr を所定の場所にコピーして確認。「スクリーンセーバーの変更」ウインドウのリスト上に、今回指定した名前が表示された。
しかし、ソース内では *.res が記述されているから、プロジェクトフォルダ内に .res があるだけで読み込んでくれそうな気もするのだけど…。わざわざ別途指定しなくてもいいのかな…?
windres はFPC (Free Pascal)に同梱されている。自分の環境では、D:\Dev\lazarus\ に Lazarus をインストールしてあるので、以下にFPC(とwindres)が入ってる。
D:\Dev\lazarus\fpc\3.2.2\bin\x86_64-win64
DOS窓上で FPC が使えるようにするためのbatファイル、D:\home2\bin\fpcenable.bat を作成しておいた。とメモ。実行すると環境変数PATHの先頭にFPCのパスが追加されて、FPCに同梱されたアレコレが利用できるようになる。
@echo off @rem FPC (Free Pascal) enable set FPCPATH=D:\Dev\lazarus\fpc\3.2.2\bin\x86_64-win64 set PATH=%FPCPATH%;%PATH% echo Enable FPC (Free Pascal). Add path : %FPCPATH%
リソースファイル(リソーススクリプトファイル) strings.rc を作成。中身は以下。スクリーンセーバ名を記述してる。
STRINGTABLE BEGIN 1, "Lazarus SSaver 1" END
windres で .rc を .res に変換。
windres strings.rc strings.res
.lpr にリソースファイル strings.res を読み込むように記述を追加。
{$R *.res}
↓
{$R *.res}
{$R strings.res}
この状態でビルドして、出来上がった .scr を所定の場所にコピーして確認。「スクリーンセーバーの変更」ウインドウのリスト上に、今回指定した名前が表示された。
しかし、ソース内では *.res が記述されているから、プロジェクトフォルダ内に .res があるだけで読み込んでくれそうな気もするのだけど…。わざわざ別途指定しなくてもいいのかな…?
◎ 自動で変換 :
頻繁に .rc を修正するなら、自動で .res に変換するように指定することもできそう。
これで、ビルドする前に strings.rc を strings.res に変換してからビルドしてくれる。
ただ、これだと毎回変換されそうな…。そう頻繁に変換するものでもないよな…。手作業で .res に変換してもさほど困らない気もする。
- プロジェクト → プロジェクトオプション → コンパイラオプション → コンパイラコマンド。
- 次の前に実行、の「コンパイル」「構築」にチェックを入れて、「実行」のチェックを外す。
- コマンド入力欄に windres strings.rc strings.res と打ち込んでおく。
これで、ビルドする前に strings.rc を strings.res に変換してからビルドしてくれる。
ただ、これだと毎回変換されそうな…。そう頻繁に変換するものでもないよな…。手作業で .res に変換してもさほど困らない気もする。
◎ .rcを直接記述 :
以下を眺めていたら…。
_Lazarus Resources - Free Pascal wiki
FPC 2.4 以降、かつ、windres にパスが通っていれば、ソース中に直接 .rc を記述してもいける、と書いてあるように見える…。
また、FPC 3.3.1 以降なら、コンパイラに -FF を指定することで、windres ではなく fpcres を使うように指示できる、とも書いてあるような…。でも、その -FF ってどこで指定すればいいのやら…。
_lazres - Free Pascal wiki
lazres なるツールもあるっぽい。tools/ の中にあると書いてある。
試しに .res を削除してから、ソースコード内に .res ではなく .rc と書いてみた。
ビルドが通ってしまった。もしかして、これだけで良かったのか…。
_Lazarus Resources - Free Pascal wiki
FPC 2.4 以降、かつ、windres にパスが通っていれば、ソース中に直接 .rc を記述してもいける、と書いてあるように見える…。
また、FPC 3.3.1 以降なら、コンパイラに -FF を指定することで、windres ではなく fpcres を使うように指示できる、とも書いてあるような…。でも、その -FF ってどこで指定すればいいのやら…。
_lazres - Free Pascal wiki
lazres なるツールもあるっぽい。tools/ の中にあると書いてある。
試しに .res を削除してから、ソースコード内に .res ではなく .rc と書いてみた。
{$R *.res}
{$R strings.rc}
ビルドが通ってしまった。もしかして、これだけで良かったのか…。
◎ 余談。Perl側のwindresのほうが新しかった :
余談。自分の環境の場合、環境変数 PATH の中に Perlのインストール場所も入っているけれど、その Perl も windres を持っているので、Perl と FPC のどっちの windres が使われてしまうのかちょっと分からないなと…。手作業で .res に変換したほうが確実だろうか?
確認してみたら、Perl のほうが windres 2.32 で、FPC のほうが windres 2.28 だった。FPC側よりPerl側の windres のほうが新しいから、仮にそちらが使われても問題は無いのかもしれない。とメモしておく。
確認してみたら、Perl のほうが windres 2.32 で、FPC のほうが windres 2.28 だった。FPC側よりPerl側の windres のほうが新しいから、仮にそちらが使われても問題は無いのかもしれない。とメモしておく。
> which windres "D:\Perls\strawberry\5.32.1.1-x64\c\bin\windres.exe" > windres -V GNU windres (GNU Binutils) 2.32 Copyright (C) 2019 Free Software Foundation, Inc. ... > fpcenable Enable FPC (Free Pascal). Add path : D:\Dev\lazarus\fpc\3.2.2\bin\x86_64-win64 > which windres "D:\Dev\lazarus\fpc\3.2.2\bin\x86_64-win64\windres.exe" > windres -V GNU windres (GNU Binutils) 2.28 Copyright (C) 2017 Free Software Foundation, Inc. ...
[ ツッコむ ]
以上です。