いちばん小さい Windows プログラムを作ろう!
前節までで基本的なビルドの方法もわかりました。それでは、いよいよ最も単純な Windows プログラミング版、Hello, world を作りましょう!
次の内容を helloworld.cpp として保存してください。
#include <windows.h> int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MessageBox( NULL, TEXT("Hello, world!"), TEXT("Hello"), MB_OK | MB_ICONINFORMATION ); return 0; }
たったこれだけの中に、何やら見慣れないキーワードが山ほど出てきましたね。 WINAPI、LPSTR、TEXT ってなんでしょうか。しかも、そもそも C 言語で書いているはずなのに main もありません。 一体これはどういうことでしょうか?
まさにこれこそが Windows プログラミングの難しさなので、なんだコリャ、と思って当然です。
後でちゃんと解説しますのでご心配なく!
今はとりあえずファイルを作って、ビルドして実行してみてください。
このプログラムの makefile は以下です。以下の内容を makefile という名前で保存してください。
TARGETNAME=helloworld OUTDIR=.\chk LINK32=link.exe ALL : "$(OUTDIR)\$(TARGETNAME).exe" "$(OUTDIR)" : @if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" # compile CPP_PROJ=\ /nologo\ /W4\ /Fo"$(OUTDIR)\\"\ /Fd"$(OUTDIR)\\"\ /c\ /Zi\ /DUNICODE\ /D_UNICODE\ LINK32_FLAGS=\ user32.lib\ /nologo\ /subsystem:windows\ /pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\ /out:"$(OUTDIR)\$(TARGETNAME).exe"\ /DEBUG LINK32_OBJS= \ "$(OUTDIR)\$(TARGETNAME).obj" "$(OUTDIR)\$(TARGETNAME).exe" : "$(OUTDIR)" $(LINK32_OBJS) $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS) .cpp{$(OUTDIR)}.obj: $(CPP) $(CPP_PROJ) $<
前回までの makefile と異なる点は、(1) user32.lib をリンク (2) /subsystem リンカオプションに windows を指定、の二つです。
user32.lib をリンクする必要があるのは Win32 API の MessageBox 関数を使っているためです。user32.lib を必要としない API だけでプログラムを記述している場合は、user32.lib をリンクする必要はありません。 また、/subsystem リンカオプションの windows という指定はいつも必要です。
上記の helloworld.cpp と makefile を同じディレクトリに保存し、nmake を実行し、 chk ディレクトリに正しく helloworld.exe が作成されることを確認してください。
> nmake -a Microsoft (R) Program Maintenance Utility Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. if not exist ".\chk/" mkdir ".\chk" cl /nologo /W4 /Fo".\chk\\" /Fd".\chk\\" /c /Zi /DUNICODE /D_UNICODE "helloworld.cpp" helloworld.cpp helloworld.cpp(8) : warning C4100: 'nCmdShow' : unreferenced formal parameter helloworld.cpp(7) : warning C4100: 'lpCmdLine' : unreferenced formal parameter helloworld.cpp(6) : warning C4100: 'hPrevInstance' : unreferenced formal parameter helloworld.cpp(5) : warning C4100: 'hInstance' : unreferenced formal parameter link.exe user32.lib /nologo /subsystem:windows /pdb:".\chk\helloworld.pdb" /machine:I386 /out:".\chk\helloworld.exe" /DEBUG ".\chk\helloworld.obj"
さらに helloworld.exe を実行し、以下のようにポップアップメッセージが表示されることを確認してください。
それでは、次節でこのプログラムの意味を解説します。