２

・プロジェクト名.cpp

```
#include "stdafx.h"
#include "Bootup.h"
#include "SplashWnd.h"
#include "Util.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

////////////////////////////////////////////////////////////////////////
// 表示リソース
////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------
// デストラクタ
//----------------------------------------------------------------------

SplashResource::~SplashResource()
{
	// ビットマップ
	HBITMAP hBmp = (HBITMAP) BackgraoundBitmap.Detach();
	if (hBmp) {
		DeleteObject(hBmp);
	}
}

//----------------------------------------------------------------------
// 表示オブジェクトを作成する
//----------------------------------------------------------------------

void SplashResource::Create(BootupProfile* profile)
{
	// ビットマップ
	HBITMAP hBmp = (HBITMAP) LoadImage(
										0,
										profile->splashInfo.BackgraoundBitmapFilename,
										IMAGE_BITMAP,
										0,
										0,
										LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE
										);
	if (hBmp) {
		BackgraoundBitmap.Attach(hBmp);
	}
}

////////////////////////////////////////////////////////////////////////
// スプラッシュウィンドウを表示して、アプリケーションを起動する
////////////////////////////////////////////////////////////////////////

//----------------------------------------------------------------------
// メッセージマップの定義
//----------------------------------------------------------------------

BEGIN_MESSAGE_MAP(CBootupApp, CWinApp)
//	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

//----------------------------------------------------------------------
// コンストラクタ
//----------------------------------------------------------------------

CBootupApp::CBootupApp() :
	m_pSplashWnd(0)
{
}

//----------------------------------------------------------------------
// 設定情報を得る
//----------------------------------------------------------------------

BootupProfile* CBootupApp::GetProfile()
{
	return &m_profile;
}

//----------------------------------------------------------------------
// 表示リソースを得る
//----------------------------------------------------------------------

SplashResource* CBootupApp::GetSplashResource()
{
	return &m_splashResource;
}

//----------------------------------------------------------------------
// CBootupApp オブジェクトの初期化を行う
//----------------------------------------------------------------------

BOOL CBootupApp::InitInstance()
{
	CWinApp::InitInstance();

	// 設定情報を読み込む
	CBootupProfileReader profileReader;
	profileReader.LoadProfile(Util::GetModuleFilepath(PROFILE_FILENAME), m_profile);

	// カレントディレクトリを設定する
	CString currentDirectory = Util::GetModuleFilepath(_T(""));
	SetCurrentDirectory(currentDirectory);

	// 表示リソースを作成する
	m_splashResource.Create(&m_profile);

	// ウィンドウのサイズを調整する
	int width = DEF_WND_WIDHT;
	int height = DEF_WND_HEIGHT;
	if (m_splashResource.BackgraoundBitmap.GetSafeHandle()) {
		BITMAP bmpInfo;
		m_splashResource.BackgraoundBitmap.GetBitmap(&bmpInfo);
		width = bmpInfo.bmWidth + 2;	// 左右の枠分を足す
		height = bmpInfo.bmHeight + 2;	// 上下の枠分を足す
	}

	if (m_profile.splashInfo.Width == 0) {
		m_profile.splashInfo.Width = width;
	}
	if (m_profile.splashInfo.Height == 0) {
		m_profile.splashInfo.Height = height;
	}

	// スプラッシュウィンドウを作成・表示する
	m_pMainWnd = m_pSplashWnd = new CSplashWnd();
	if (!m_pSplashWnd) {
		return FALSE;
	}

	RECT rect;
	SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID) &rect, 0);

	m_pSplashWnd->CreateEx(
						WS_EX_TOOLWINDOW | WS_EX_TOPMOST,
						AfxRegisterWndClass(CS_DBLCLKS, ::LoadCursor(0, IDC_APPSTARTING)),
						0,
						WS_BORDER | WS_POPUP,
						(rect.right - rect.left - m_profile.splashInfo.Width) / 2,
						(rect.bottom - rect.top - m_profile.splashInfo.Height) / 2,
						m_profile.splashInfo.Width,
						m_profile.splashInfo.Height,
						0,
						0
					);
	m_pSplashWnd->ShowWindow(SW_SHOW);
	m_pSplashWnd->UpdateWindow();

	// プログラムを起動する
	if (0 < m_profile.splashInfo.BootupProgramFilename.GetLength()) {

		CString commandLine;
		CArray<TCHAR> bcmdLine;

		commandLine.Format(_T("%s %s"), m_profile.splashInfo.BootupProgramFilename, m_profile.splashInfo.BootupProgramParameter);
		bcmdLine.SetSize(commandLine.GetLength() + 1);
		TCHAR* pbcmdLine = bcmdLine.GetData();
		if (pbcmdLine) {
			_tcscpy_s(pbcmdLine, bcmdLine.GetSize(), commandLine);
			pbcmdLine[commandLine.GetLength()] = _T('\0');
		}

		STARTUPINFO si;
		PROCESS_INFORMATION pi;

		ZeroMemory(&si, sizeof(si));
		si.cb = sizeof(si);
		ZeroMemory(&pi, sizeof(pi));

		BOOL rc = CreateProcess(
							0, pbcmdLine,
							0, 0,
							FALSE,
							CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
							0, currentDirectory,
							&si, &pi
						);
		if (rc) {
			CloseHandle(pi.hProcess);
			CloseHandle(pi.hThread);
		}
	}

	return TRUE;
}

//----------------------------------------------------------------------
// 終了処理を行う
//----------------------------------------------------------------------

int CBootupApp::ExitInstance()
{
	if (m_pSplashWnd) {
		delete m_pSplashWnd;
		m_pSplashWnd = 0;
	}

	return CWinApp::ExitInstance();
}

////////////////////////////////////////////////////////////////////////
// CBootupApp オブジェクトの定義
////////////////////////////////////////////////////////////////////////

CBootupApp theApp;