まだまだ木の芽程度ですが、芽から木、木から林、林から森へと大きくしていきたい・・・。
プロジェクト形態によっては若干異なりますが、アプリケーションウィザードで生成された stdafx.h には以下のような記述があります。
|
afxwin.h は5000行ほど記述があります。さらに他のヘッダーファイルをインクルードしていますので実際にはもっともっと多くなります。
(afxwin.h → afx.h → afxver_.h → afxv_w32.h とたどっていくと windows.h もインクルードされていることがわかります。)
ここで、A.cpp というソースファイルと B.cpp というソースファイルがあり、それぞれ afxwin.h をインクルードしていた場合を考えます。
コンパイラは、A.cpp をコンパイルする際に必要な afxwin.h の展開処理 を行います。
また、B.cpp をコンパイルする場合にも同様に afxwin.h を展開 します。当然 A.cpp、B.cpp それぞれに対してそれなりの時間がかかります。これが10個、100個と数が多くなったらものすごく時間がかかることになります。
そこで、A.cpp をコンパイルした際に登場した afxwin.h の展開結果をそのまま B.cpp に適用することが出来れば速度アップが望めます。
つまり、
「同じ展開処理は毎回行わず、一度展開した結果を再利用するための情報を抽出すること」が プリコンパイル です。
プリコンパイルされた情報は、XXX.pch というファイル(XXXはプロジェクト名)に書き出されています。デフォルトでも数MB〜数十MBのサイズになります。
|
プロジェクトでプリコンパイル済みヘッダーを利用する場合、すべてのcppファイルにおいて stdafx.h をインクルードしておく必要があります。 |
ProcessShellCommand関数 へ渡す CCommandLineInfoインスタンス のメンバ変数を変更します。
BOOL CMyApp::InitInstance()
{
|
ParseCommandLine関数 は、アプリケーションのコマンドライン引数を解析し、次の ProcessShellCommand関数 で処理すべき情報を cmdInfo変数 に格納してくれます。 cmdInfo.m_nShellCommand が FileNew に設定されている場合、新しいビューを作成することになりますので、この場合に何もしない FileNothing に書き換えてやります。
コマンドライン引数の例(cmdInfo を生成時のまま ParseCommandLine関数 へ渡した場合)| コマンドライン引数 | cmdInfo.m_nShellCommand値 | 実行されるコマンド |
| app | −(FileNewから変更なし) | 新規作成 |
| app filename | FileOpen | 開く |
| app /p filename | FilePrint | デフォルト プリンタにファイルを印刷 |
| app /pt filename printer driver port | FilePrintTo | 指定のプリンタにファイルを印刷 |
| app /dde | FileDDE | 起動し、DDE コマンドを待つ |
| app /Automation | − | OLE オートメーション サーバーとして起動 |
| app /Embedding | − | 埋め込まれた OLE アイテムとして起動 |
UpdateAllViews関数 を呼び出します。第1引数をNULLとすることで、ドキュメントにリンクされているすべてのビューに対して CView::OnUpdate関数 が呼び出されます。
UpdateAllViews(NULL, 0, NULL); |
とっても簡単。以下の一行で起動できます。
SendMessage(hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, NULL); |