2009年7月31日金曜日

C++ で Hello World

[したいこと・しりたいこと]
[目標]
Windows の Visual C++ 2008 Express で Hello World
C++ で Hello World

[環境]
Windows XP SP3 on VMWare
USB 104Key (US)

[前提]


Open Command Window Here が インストールされている
Microsoft PowerToys for Windows XP
http://www.microsoft.com/windowsxp/Downloads/powertoys/Xppowertoys.mspx




[したこと]
(1)Visual C++ 2008 Express Edition の インストール

Microsoft Visual C++ 2008 Express Edition の インストール
Microsoft Visual Studio 2008 Express Edition
http://www.microsoft.com/japan/msdn/vstudio/express/

Microsoft Visual Studio 2008 Express Edition の DVD イメージからのインストール方法
http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/offline.aspx

Visual Studio 2008 Express Edition with Service Pack 1 Combo DVD を ダウンロード

iso ファイルを 仮想マシンの CD にセットする

インストーラーの指示にしたがって、インストール

(2)[マイ ドキュメント] に vs フォルダを作る

(3)vs.bat ファイルを作る

vs フォルダに [新規テキスト ドキュメント.txt] ファイルを作る
vs.bat に 名前の変更をする

---------------ここから

"C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\"vsvars32.bat

---------------ここまで

(4)ソースコードを書く

vsフォルダに 新規テキスト ドキュメント.txt ファイルを作る
hello.cpp に 名前の変更をする

hello.cpp

---------------ここから

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


/* WinMain(), our entry point */

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR szCmdLine, int iCmdShow) {
static char szAppName[] = "winhello";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;


/* Fill in WNDCLASSEX struct members */

wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;


/* Register a new window class with Windows */

RegisterClassEx(&wndclass);


/* Create a window based on our new class */

hwnd = CreateWindow(szAppName, "Hello, world!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);


/* Show and update our window */

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);


/* Retrieve and process messages until we get WM_QUIT */

while ( GetMessage(&msg, NULL, 0, 0) ) {
TranslateMessage(&msg); /* for certain keyboard messages */
DispatchMessage(&msg); /* send message to WndProc */
}


/* Exit with status specified in WM_QUIT message */

return msg.wParam;
}


/* Window procedure */

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps;
HDC hdc;


/* Switch according to what type of message we have received */

switch ( iMsg ) {
case WM_PAINT:

/* We receive WM_PAINT every time window is updated */

hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, "Hello, world!", 13);
EndPaint(hwnd, &ps);
return 0;

case WM_DESTROY:

/* Window has been destroyed, so exit cleanly */

PostQuitMessage(0);
return 0;
}


/* Send any messages we don't handle to default window procedure */

return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

---------------ここまで

(5)コマンドプロンプトを開く

plan-1
[マイ ドキュメント] を開く
vs フォルダを右クリックし、[Open Command Window Here] を 選択

plan-2
[スタート] [すべてのプログラム] [アクセサリ] [コマンドプロンプト] からコマンドプロンプトを開く
以下の2つのコマンドを入力して vs フォルダに移動する

cd "My Documents"
cd vs

(6)コンパイル
cl /c hello.cpp
link hello.obj user32.lib gdi32.lib

(7)実行
hello.exe

[参考]
HTML output
http://www.paulgriffiths.net/program/c/srcs/winhellosrc.html