2007 年 8 月 20 日 23 時 9 分

実行してみる


このアーカイブは同期化されません。 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 が登録されているため。
右クリックメニューより、設定やテスト、
インストール(画面のプロパティに選択)が可能である。

大してコードを書いていないので、
設定ダイアログもプレビューも無味乾燥だが、
スクリーンセーバーとして機能していることが分かる。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.