Win32 app from command line
Windows の GDI の使い方の本を読み始める。その前に、別な本で MFC から入ろうとが、Visual C++ Express Edition では MFC は使えないということでがっかり。(Win32 のプロジェクトを作る時の Wizard ではグレイアウトしていて使えないが、あとからプロジェクトのプロパティを見ていくと指定できそうな気がするが、まだ試していない。)
コマンドラインから起動するコンパイラは cl, リンカは link というを最近知った。そうするとどうしてもコマンドラインからコンパイルしたくなってしまう。
最初に読んだ本では Visual Studio は makefile (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
#includevoid 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)