GDI+の初期化と終了 その2

要約

以前に書いたやつにエラーチェックを加えました。
このクラスはコンストラクタで初期化処理を行い、デストラクタで終了処理を行ってくれる優れものです。

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

アイディアそのものはこの本で知りました。
また、エラーチェックという、後回しにした挙句忘れてしまいがちな処理を思い出させてくれたのは以下のロシア製の掲示板。
ttp://www.gamedev.ru/code/forum/?id=87148

ソース
// GdiplusInit.h
#pragma once
//#include <windows.h>
//#include <gdiplus.h>
using namespace Gdiplus;

class CGdiplusInit {
private:
	ULONG_PTR		m_gdiplusToken;
	Status		m_res;			// Result

public:
	// Initialize 初期化
	CGdiplusInit()
	{
		GdiplusStartupInput gdiplusStartupInput;
		m_res = GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
	}

	// Shutdown 終了
	~CGdiplusInit()
	{
		if( Result())
			GdiplusShutdown( m_gdiplusToken);
	}

	// Get .... qawsedrftgyhjikl. 初期化の結果を得る
	bool Result()
	{
		return m_res == Ok;
	}
};

あと、gdiplus.libをリンクするのも忘れずに。VC++2008EEなら

#pragma comment(lib, "gdiplus.lib")

と書くだけでもいい。

使い方
INT WinMain(...)
{
    // いろいろ

    CGdiplusInit gdiplusInit;
    if(! gdiplusInit.Result()) {
        MessageBox( NULL, _T("GDI+の初期化に失敗しました。"),
            _T("エラー"), MB_OK);
        return 1;
    }

    // いろいろ

     return 0;
}
注意

以前にも書きましたが、CGdiplusInitのデストラクタが呼ばれてGDI+の終了処理が行われる前に(WinMainが終わる前に)、全てのGDI+オブジェクト(GDI+のクラスのインスタンス)を解放してください。
つまりグローバル変数や静的変数に注意してください。そのような変数を使う場合はポインタにしてnew/deleteを行うようにすれば、とりあえず問題ないです。