ビルドするための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()関数から動作するウィンドウアプリケーションにはコンソールがひもづけられていない。このため、標準出力へ書き込んでもどこへも表示されない。
標準出力へメッセージを出そうとした場合、いくつか方法はあるが、基本的にはコンソールに接続して、そこの標準出力へのひもづけを行って、そこから標準出力への出力を行う必要がある。この方法でもよいのだが、前回は状況をシンプルに解決するために「ファイルへ書き出す」という方法を取った。データをファイルへ書き出すのはさまざまな処理の基本中の基本なので、ここで取り上げておいてよいだろう。