Windows APIを使うのだから、CUIアプリケーションではなくGUIアプリケーションを作ってみよう。Windows APIはこの辺りの開発が簡単にできるところがポイントだ。最初はメッセージダイアログをつくるのがよいと思う。ソースコードが短く理解しやすいからだ。

Windows APIで初めてのウィンドウプログラミング

前回までに、ビルドツールとして「Visual Studio Build Tools 2022」をインストールし、「Developer Command Prompt for VS 2022」でHello Worldプログラムをビルドして実行することを確認した。Microsoft C/C++を使った最も簡単なプログラムのビルドを動作を確認したといったところだ。

Windows APIを使うのだから、CUIアプリケーションではなくGUIアプリケーションを作ってみよう。Windows APIはこの辺りの開発が簡単にできるところがポイントだ。最初はメッセージダイアログをつくるのがよいと思う。ソースコードが短く理解しやすいからだ。

メッセージダイアログを作成する代表的なAPIであるMessageBox()の説明は次のページにまとまっている。

このドキュメントには次のようなサンプルソースコードが掲載されている

WinMain function (winbase.h) - Win32 apps | Microsoft Docs に掲載されているサンプルソースコード

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
    return MessageBox(NULL, "hello, world", "caption", 0);
}

このサンプルソースコードをベースにカスタマイズを行って、初めてWindows APIを使ったウィンドウプログラミンを行ってみよう。

メッセージダイアログ「MessageBox」

先ほどのサンプルプログラムのままでは芸がないので、次のようにメッセージ部分を日本語に変えたソースコードを用意する。

helloworld.c

/*
 * Reference:
 *    https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain
 */
#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
  return MessageBox(NULL, "新大陸へようこそ!", "はじめてのウィンドウプログラミング", 0);
}

このプログラムをcl.exeでコンパイルし、link.exeでリンクすればビルド完了だ。前回のnmake用のMakefileを作成したわけだが、このファイルを今回のケースに置き換えたものを用意する。

nmake用のMakefile

CMD=    helloworld

CC= cl.exe
CFLAGS= /c

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

前回との違いはlink.exeでリンクする対象に「user32.lib」を追加している点にある。利用するWindows APIの実態がそこにあるからで、このファイルをリンクしないと実行することができない。手動でMakefileを整えていくと、このようにどのファイルをリンクして使っているのかがよくわかってくる。

オブジェクトファイルを生成するためのコンパイルと、実行ファイルを生成するためのリンクの処理を次に書いておく。

オブジェクトファイルの生成

cl.exe /c helloworld.c

実行ファイルの生成

link.exe user32.lib helloworld.obj

上記手順でビルドを行えばhelloworld.exeという実行ファイルが生成される。生成された実行ファイルを実行すると次のようになる。

  • メッセージダイアログ実行例 - 文字化けしている

    メッセージダイアログ実行例 - 文字化けしている

Windows APIを使ったウィンドウプログラムの初実行だ。しかしながら、ウィンドウタイトルも、ダイアログ内のテキストも文字化けした状態だ。失敗してしまったが、まず「ウィンドウプログラミングをする」という目的は達成といったところだ。