このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
これで、リソースと関数が揃った。
後は Windows の実行イメージファイルを作るだけだ。
最初に、module.cpp をコンパイルして、
オブジェクトファイル module.obj を作成する。
Microsoft の C++ コンパイラは、cl.exe だ。
$ cl /c /W4 /Fomodule.obj module.cpp
/c スイッチは、ソースコードをコンパイルして、
オブジェクトファイルを作成する事を示す。
/W4 スイッチは、警告レベルを 4 に設定する。
これで、些細なことでも警告が出るようになる。
厳格なプログラミングには必須である。
/Fo スイッチは、出力ファイル名を明示する際に指定する。
これで、オブジェクトファイルやライブラリが揃った。
後はリンクするだけだが、その前に少し作業がある。
scrnsave.lib を使う場合、2 つの関数、
ScreenSaverConfigureDialog と ScreenSaverProc を
そのままの名前でエクスポート(公開)しなければならない。
(仕組み的には不要なはずだが、SDK には必須とある)
意外に知られていないが、実行可能イメージ (EXE) でも、
関数をエクスポートすることができる。
その方法はダイナミックリンクライブラリ (DLL) と同じで、
関数に __declspec(dllexport) をつけて宣言するか、
モジュール定義ファイル (DEF) を使うかのどちらかである。
前者の方が簡単なのだが、公開される関数は、
装飾名がそのまま使われてしまうため、今回は適さない。
そこで、DEF ファイルを作成することにする。
========== module.def ==========
EXPORTS
ScreenSaverProc
ScreenSaverConfigureDialog
========== end of module.def ==========
さて、役者は揃った。
スクリーンセーバーは拡張子を SCR にするだけで、
リンクの方法は、実行可能イメージと変わらない。
Microsoft の リンカは、link.exe だ。
$ link /subsystem:windows /def:module.def /out:demo.scr ^
module.obj resource.res kernel32.lib advapi32.lib ^
user32.lib gdi32.lib comctl32.lib scrnsave.lib
/subsystem:windows スイッチは GUI プログラムを意味する。
/subsystem:console なら、CUI のコンソールアプリだ。
/def スイッチでモジュール定義ファイルを指定する。
/out スイッチでは出力ファイル名を指定する。
スイッチ以外のコマンド引数はリンクさせるファイルだ。
自作のものは module.obj と resource.res、
そしてスクリーンセーバーのライブラリの scrnsave.lib、
後は Windows API を提供しているコアライブラリである。
これでやっと demo.scr が作成できた。
では試してみよう。スクリーンセーバーの実行には、
/S や /C 等のスイッチを引き渡す必要があるが、
エクスプローラには拡張子 .SCR が登録されているため。
右クリックメニューより、設定やテスト、
インストール(画面のプロパティに選択)が可能である。
大してコードを書いていないので、
設定ダイアログもプレビューも無味乾燥だが、
スクリーンセーバーとして機能していることが分かる。