プロが教えるわが家の防犯対策術!

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;
}

A 回答 (2件)

たぶんだけど、


片方はマルチバイト文字を既定に指定していて、
もう片方はUNICODEを既定にしているせいだと思うよ

tchar.hをインクルードして、文字列は全て_Tマクロでくくれば問題は解決すると思われます


const char CLASS_NAME[] = "WinMain";

から

LPCTSTR CLASS_NAME = _T("WinMain");

こんなかんじに全て書き直す
    • good
    • 0
この回答へのお礼

実践してみましたところ正しく動作させることができました。
文字コードについてもう一度よく調べてみます。
丁寧な回答ありがとうございました。

お礼日時:2014/03/14 19:55

>VisualStudioでC++プロジェクトを作る際、



バージョンとかも明記した方がいいと思いますが……。


>const char CLASS_NAME[] = "WinMain";
>wcx.lpszClassName = CLASS_NAME;
で、
>CLASS_NAMEにご完成がないとエラーが

となると……
プロジェクトの文字コード辺りでしょうかね。
差異があるとしたら。
    • good
    • 0
この回答へのお礼

バージョンは2013です。
あと、互換性の感じが間違ってますね・・・
わかりにくい質問にもかかわらず早い回答をくださりありがとうございます。

プロジェクトの文字コードについて調べてみます。

お礼日時:2014/03/14 19:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!