いちばん小さい 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.cppmakefile を同じディレクトリに保存し、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 を実行し、以下のようにポップアップメッセージが表示されることを確認してください。

それでは、次節でこのプログラムの意味を解説します。

» プログラムはどこから始まるの? ~ WinMain とは?

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説