・プロジェクト名.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;