コンソールアプリケーションの空のプロジェクト
VisualStudioでC++プロジェクトを作る際、
「コンソールアプリケーション、プロジェクト、空のプロジェクト、メイクファイルプロジェクト」
からプロジェクトの種類を選びますが、このとき
「コンソールアプリケーションを選び、「アプリケーションウィザードで「□空のプロジェクト」にチェックを入れて作った」プロジェクトと、
「空のプロジェクトを選択して作った」プロジェクトはどう違うのでしょうか?
先日プログラムを書いていたのですが、全く同じ文章であるにもかかわらず前者ではコンパイルエラーが起こり、後者は問題なく起動するということがありました。
プロジェクトの種類によってどのような動作をする際に差が出るのでしょうか?
よろしくお願いします。
なお、上記の「全く同じ文章であるにもかかわらず前者ではコンパイルエラーが起こり、後者は問題なく起動した」プログラムは以下のもので、「58行目と63行目のCLASS_NAMEにご完成がないとエラーが出ました」。
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
bool CreateMainWindow(HINSTANCE, int);
LRESULT WINAPI WinProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hinst;
const char CLASS_NAME[] = "WinMain";
const char APP_TITLE[] = "Hello World";
const int WINDOW_WIDTH = 400;
const int WINDOW_HEIGHT = 400;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLinc, int nCmdShow)
{
MSG msg;
if (!CreateMainWindow(hInstance, nCmdShow)){ return false; }
int done = 0;
while (!done)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT){ done = 1; }
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
bool CreateMainWindow(HINSTANCE hInstance, int nCmdShow)
{
WNDCLASSEX wcx;
HWND hwnd;
wcx.cbSize = sizeof(wcx);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = WinProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = NULL;
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcx.lpszMenuName = NULL;
wcx.lpszClassName = CLASS_NAME;
wcx.hIconSm = NULL;
if (RegisterClassEx(&wcx) == 0){ return false; }
hwnd = CreateWindow(CLASS_NAME, APP_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, (HWND)NULL, (HMENU)NULL, hInstance, (LPVOID)NULL);
if (!hwnd){ return false; }
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
return true;
}
お礼
GetLastErrorは1400(ウィンドルハンドルが不正)が返されていました。 GetModuleHandle(0)を実行するとH'00400000が戻りました。 試しにコンソールアプリケーションのかわりにWINDOWSフォームアプリケーションを作成してみると、 関数WinMainの引数hInstanceにもH'00400000が格納されていました。 これで次のステップに進めそうです。 ありがとうございました。