Win32 app from command line

Windows の GDI の使い方の本を読み始める。その前に、別な本で MFC から入ろうとが、Visual C++ Express Edition では MFC は使えないということでがっかり。(Win32 のプロジェクトを作る時の Wizard ではグレイアウトしていて使えないが、あとからプロジェクトのプロパティを見ていくと指定できそうな気がするが、まだ試していない。)

コマンドラインから起動するコンパイラは cl, リンカは link というを最近知った。そうするとどうしてもコマンドラインからコンパイルしたくなってしまう。

最初に読んだ本では Visual Studiomakefile (nmake) はサポートしているが、プロジェクトの makefile をエクスポートするような機能はもう無いらしい。代わりに devenv.exe というコマンドでソリューションやプロジェクトの設定ファイルを指定してビルドはできるらしいが、Visual Studio コマンドプロンプトからは見つからないようだ。

既存のプロジェクトからコンパイラ、リンカのオプションを試行錯誤してみて、次のコマンドラインコンパイルできることが分かった。


cl /Od /D WIN32 /D _WINDOWS /D _UNICODE /D UNICODE /Gm /EHsc /RTC1
/MDd /W3 /ZI /TP hello2.cpp /link /SUBSYSTEM:WINDOWS kernel32.lib
user32.lib gdi32.lib

/link 以降は linker へのオプション。ソースファイル名はその前に指定する。
途中、entry point の指定が無いようなことを言われたので、/SUBSYSTEM:WINDOWS
で WinMain を見に行くようになるのかと思ったりもしたが、そうではないらしい。


// Hello2.cpp
#define STRICT
#define WIN32_LEAN_AND_MEAN

#include
#include
#include

void CenterText(HDC hDC, int x, int y, LPCTSTR szFace,
LPCTSTR szMessage, int point)
{
HFONT hFont = CreateFont(
-point * GetDeviceCaps(hDC, LOGPIXELSY) / 72,
0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE,
ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
PROOF_QUALITY, VARIABLE_PITCH, szFace);
assert(hFont);

HGDIOBJ hOld = SelectObject(hDC, hFont);

SetTextAlign(hDC, TA_CENTER | TA_BASELINE);

SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0, 0, 0xFF));
TextOut(hDC, x, y, szMessage, _tcslen(szMessage));
SelectObject(hDC, hOld);
DeleteObject(hFont);
}

const TCHAR szMessage[] = _T("Hello, World");
const TCHAR szFace[] = _T("Times New Roman");

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE,
LPSTR lpCmd, int nShow)