xreaad
[ FrontPage | リロード ] [ 新規 | 一覧 | 検索 | ヘルプ | 更新履歴 ]
[ 編集 | 差分 | ソース ]

駄文 > 参考にしてはいけないWindowsSDKレシピ > 1 - Hello World!

目次

Hello World!

[編集]

Windowsのプログラミングを始める際にまずHello Worldを書いてみましょう。

1 | #include <windows.h>
2 | 
3 | int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR args, int show)
4 | {
5 |     MessageBox(0, "Hello World", "title", MB_OK);
6 |     return(0);
7 | }

コンパイルする時は

$ cl a.c user32.lib

多分C言語での一般的なWindowsアプリの書き方です。
問題はWinMainがなげーと言う一点につきます。
引数のinstはGetModuleHandleで取れるし、argsはGetCommandLineで取れるし、showはGetStartupInfoから。
prevに至ってはWin32環境じゃ常にNULLだとか(MSDNより)。

イヤだ、こんなの毎回書きたくない。[*1]
いつものmainで書いたらダメなの!?

いや、いいんですよ。

1 | #include <windows.h>
2 | 
3 | int main(int argc, char argv[])
4 | {
5 |     MessageBox(0, "Hello World", "title", MB_OK);
6 |     return(0);
7 | }

短い(^-^)
でもこれだとDOS窓が開きます。デバッグ用にprintfとか使えて非常に便利なんですけど、
こんなのをリリースした日には、十中八九バグとして突っ返されます。
、、、何とかしましょう。

$ cl a.c user32.lib -link /subsystem:windows /entry:main

コンパイルオプションをいじったらホラできた。
解説しておくと -link 以降はリンカ(link[*2])に与えるオプションで
subsystemは、まぁwindowsとかconsoleとかあって、entryはエントリポイント(関数ですわな)の指定です。
ってこんな説明しても分からないと思うのでMSDN見て下さい。

それを利用して極端に短いHello Worldはこちら

1 | #include <windows.h>
2 | x(){MessageBox(0,"Hello World","title",0);}
$ cl a.c user32.lib -link /subsystem:windows /entry:x

あんまり変わりませんわな(^-^;)

  1. 普通コピーするかなにかするので書きません。杞憂です。
  2. cygwinとかUNIX由来のツールを入れてると/bin/linkとかちあうんですわ。

Valid XHTML 1.1
Creative Commons License This work is licensed under a Creative Commons License