Unicode でのWin32アプリのプロセスが終了しません
Visual Studio 2008 のVC++ でのアプリ開発について困っています。
開発環境はOS:Vista Ultimate 64bitです。
開発しようとしているのはWin32プロジェクトです。
先ず以下がソースです。
---
/** @brief メインファイル */
// Option declarations
#define STRICT
#define WIN32_LEAN_AND_MEAN
// Includes
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<tchar.h>
#include<process.h>
#include<windows.h>
#include<windowsx.h>
#include<winerror.h>
// Constance declarations
#define WND_CX (1024)
#define WND_CY (768)
#define ERR_QUIT (-1)
// Structures declarations
typedef struct _winapp
{
HINSTANCE hInst;
HWND hWnd;
TCHAR sTitle[128];
TCHAR sWndClass[128];
}WINAPP, *PWINAPP;
// Prototype declarations
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
HRESULT Init(WINAPP& app);
long Uninit(WINAPP& app);
WPARAM MsgLoop(WINAPP& app);
long Idle(void);
// Global variables
WINAPP g_app;
/** @brief Entry point */
int WINAPI ::_tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR pCmdLine, int shwcmd)
{
// Win32App initialize
::memset(&g_app, 0, sizeof(g_app));
g_app.hInst = hInst;
::_tcscpy_s(g_app.sTitle, sizeof(g_app.sTitle), _T("myapp"));
::_tcscpy_s(g_app.sWndClass, sizeof(g_app.sWndClass), _T("myapp"));
HRESULT hr = ::Init(g_app);
if(FAILED(hr))
return ERR_QUIT;
// Message loop
WPARAM wp = ::MsgLoop(g_app);
// WinApp32 uninitialize
::Uninit(g_app);
return (int)wp;
}
/** @brief Main window procedure */
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg){
case WM_DESTROY:
::PostQuitMessage(0);
g_app.hWnd = NULL;
break;
default:
return ::DefWindowProc(hWnd, msg, wp, lp);
}
return 0;
}
/** @brief Initialize win32 application */
HRESULT Init(WINAPP& app)
{
// Register window class
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)::WndProc;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.hInstance = app.hInst;
wc.hIcon = NULL;
wc.hIconSm = NULL;
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = app.sWndClass;
if(::RegisterClassEx(&wc)==0)
return ::GetLastError();
// Create main window
RECT rc = { 0, 0, WND_CX, WND_CY};
::AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
g_app.hWnd = ::CreateWindow( app.sWndClass, app.sTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, app.hInst, NULL);
if(app.hWnd==NULL)
return ::GetLastError();
// Show window
::ShowWindow(app.hWnd, SW_SHOWNORMAL);
::UpdateWindow(app.hWnd);
return S_OK;
}
/** @brief Uninitalize win32 application */
long Uninit(WINAPP& app)
{
return ::UnregisterClass(app.sWndClass, app.hInst);
}
/** @brief Message loop */
WPARAM MsgLoop(WINAPP& app)
{
MSG msg = {};
while(msg.message!=WM_QUIT){
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}else{
// Idle process
if(Idle()==0)
::DestroyWindow(app.hWnd); // Occur error and exit application.
}
}
return msg.wParam;
}
/** @brief Idle process */
long Idle(void)
{
return 1;
}
---
以上がソースなのですがプロジェクトのプロパティの文字セットが
Unicodeだとプロセスが終了しません。
文字セットをマルチバイトに変更するとプロセスは終了します。
なお、メイン関数を終了はしている様子。
どなたか理由がお分かりになる方はおられませんでしょうか?
お手数ですがご回答いただければ幸いです。
お礼
そのとおりでした