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
あんまり変わりませんわな(^-^;)