ビルドするためのMakefileもこれまでと同じだ。

nmake用のMakefile

CMD=    winmain

CC= cl.exe
CFLAGS= /c /source-charset:utf-8

LINK=   link.exe
LIBS=   user32.lib
LFLAGS=

EXIST=  cmd.exe /C if exist

all:    build

build:  $(CMD).exe

$(CMD).exe: $(CMD).obj
    $(LINK) $(LFLAGS) $(LIBS) *.obj
    dir

.c.o:
    $(CC) $(CFLAGS) $*.c

run:    build
    $(CMD).exe

clean:
    $(EXIST) $(CMD).obj del *.obj
    $(EXIST) $(CMD).exe del $(CMD).exe
    dir

corruption-run: clean
    $(CC) /c $(CMD).c
    $(LINK) $(LFLAGS) $(LIBS) *.obj
    $(CMD).exe

前回は説明を省いたが、今回は前回作成したファイルにログを記録する関数について説明する。

ファイルに記録する

前回作成したコードでは、まずメッセージループに次のコードを入れて、GetMessage()で取得したメッセージをログファイルへ書き込んだ。

メッセージループ内でログを書き込んでいる部分

Log_uMsg(TEXT("log1.txt"), msg.message);

ウィンドウプロシージャでは、次のコードを追加してウインドウプロシージャがコールされた最初の段階でメッセージをログファイルに書き込むようにした。

ウィンドウプロシージャ内でログを書き込んでいる部分

Log_uMsg(TEXT("log2.txt"), uMsg);

なぜファイルへ書き込んだかというと、ここで標準出力へメッセージを出力してもどこにも表示されないからだ。wWinMain()関数から動作するウィンドウアプリケーションにはコンソールがひもづけられていない。このため、標準出力へ書き込んでもどこへも表示されない。

標準出力へメッセージを出そうとした場合、いくつか方法はあるが、基本的にはコンソールに接続して、そこの標準出力へのひもづけを行って、そこから標準出力への出力を行う必要がある。この方法でもよいのだが、前回は状況をシンプルに解決するために「ファイルへ書き出す」という方法を取った。データをファイルへ書き出すのはさまざまな処理の基本中の基本なので、ここで取り上げておいてよいだろう。