ホーム | Software Lab | Profile | Favorites | Diary | Links | About This Site | Feedback
 


 

 

番外編では、WTL を使ってプログラムする際に、役立ちそうな Tips や、Roy. がはまったエラーなどを書き留めておきます。

記号

Tips
記号

Tips 1 デバッグ関数を使いこなそう

デバッグで役に立つのが、Output ウィンドウを使った出力だ。WTL では、取りあえず2つの方法がある。

void DebugOutputString(LPTCSTR);
例)DebugOutputString(_T("計算処理"));			
ATLTRACE(書式付文字列, 変数, 変数, ... );
例)ATLTRACE(_T("ループカウント %d\n"), nCnt);

特に ATLTRACE は printf 的に、書式付きで表現できるので応用範囲が広いのでお勧めです。

記号

Tips 2 ヘッダファイルを活用しよう

WTL のインストール先にあるヘッダファイルは、非常に有用なクラスを定義しているものが多いので、プロジェクトに取り込んでおくと便利。

上記で言うところの atl 〜 で始まるヘッダ群だ。
これらをプロジェクトに含むことにより、インテリセンスを有効に使うことができるし、クラスビューではそのクラスのインタフェースやメンバ等を知ることができる。

WTL には CString を始め、コモンコントロールやレジストリなど Windows プログラムでよく使われるオブジェクトや概念がテンプレートクラスとして提供されているので、是非これを活用し ましょう。

記号

Tips 3 プリコンパイルヘッダを使おう

いまさら僕が言うことでは無いと思うのですが、プリコンパイルヘッダを使用しましょう。プリコンパイルヘッダとは、VC のデフォルトでは stdafx.h という名前になってい て、コンパイル時間を短縮する目的で使われてます。

通常自分ですべて書く場合には、プリコンパイルヘッダは作成されませんが、Wizard を使う場合にはプリコンパイルヘッダを使うようにプロジェクトを構成してくれるので、是非活用してください。また WTL や STL などのテンプレートライブラリは比較的コンパイルに時間がかかる傾向にあります。

記号

Tips 4 Define に注意

WTL のテンプレートクラスは非常にいい形で、ウィンドウやコントロールをラップしていると思うのですが、これらラッパークラスのメソッドの引数や、IE、コモンコントロールのバージョンに依存する機能を使いたいときに、エラーが出るときがあります。

たとえば、CEditT<TBase> に於いて、GetImeStatus という関数を使いたいと思ったとする。ソースを見ると

#if (WINVER >= 0x0500)
    UINT GetImeStatus(UINT uStatus) const
    {
        ATLASSERT(::IsWindow(m_hWnd));
        return (UINT)::SendMessage(m_hWnd, EM_GETIMESTATUS, uStatus, 0L);
    }
    UINT SetImeStatus(UINT uStatus, UINT uData)
    {
        ATLASSERT(::IsWindow(m_hWnd));
        return (UINT)::SendMessage(m_hWnd, EM_SETIMESTATUS, uStatus, uData);
    }
#endif //(WINVER >= 0x0500)

などと定義されてい ます。
ここで、WINVER >= 0x0500 となっているということは、Windows 2000 以降でないと使えない機能 なのです。つまり、この機能を使いたい場合は、プリコンパイルヘッダに定義されているバージョン定数を変更しなくてはコンパイルできないので注意が必要です。

記号

Tips 5 CImageList の歴史

WTL の CImageList にはデストラクタがありません。ちなみに MFC の CImageList にはデストラクタがある。そのため、明示的に開放しない限りリソースがリークしてしまいます。

では、なぜこのようなことになってしまったかと言うと、Yahoo のWTL メーリングリストで議論がありました。つまり、すべての ImageList がデストラクタで解放してほしいとは限らず(たとえばシステムイメージリスト)、柔軟な利用を意図しているからと言うことになります。

一方で他のリソースのようにテンプレート引数で管理したらどうなのか?といった議論もあったようです。たとえば、CPen などは

///////////////////////////////////////////////////////////////////////////////
// CPen

template <bool t_bManaged>
class CPenT
{
public:
// Data members
    HPEN m_hPen;

// Constructor/destructor/operators
    CPenT(HPEN hPen = NULL) : m_hPen(hPen)
    { }

    ~CPenT()
    {
        if(t_bManaged && m_hPen != NULL)
            DeleteObject();
    }

といったようにテンプレート引数 t_bManaged で、管理するようになっています。CImageList も同様に管理すればいいのでは?という提案がありましたが、WTL 3.1 以前との互換性のことを考えて、そのままにしてあるようです。

リソースリークにお気をつけください。

最終更新日 : 2005/06/05