| Home | Develop | Customize | App |
MSDNを見ていると、ATL/ATL Server に属する便利そうなクラスがいくつか見つかります。 STLと重なる部分もありますが、Windows用途に特化されていますので、より便利な部分もあるようです。
私はWTLから入ったので、ATL/COMのことがほとんどわかってません。 (WTLはテンプレートがわかっていればATLを知らなくても使えてしまいますし。) おかしなところもあると思いますが、ご容赦ください。 コンセプトは、「とりあえずヘッダをインクルードするだけみたいなんで使ってみよう」です。
既存の MFC::CString とインタフェース互換の文字列。
std::string に比べ、内部バッファの取得ができるのと、operator const CharType*が定義されているのが大きな違い。
また、StringTraits のおかげでCRTを使わない場合でも様々な文字列処理関数が使えるのがメリット。
std::iostream と組み合わせる必要が無ければ、std::string よりも使い勝手がよいと思われる。
マルチバイトとワイド文字列を相互に変換するクラス。
通常は、typedefされた名前(CW2A, CA2CT, CT2WEX etc.)を使う。
MultiByteToWideChar() / WideCharToMultiByte() の代わりに使うと便利。
変換前と後の文字コードが同じで、文字列を変更する必要が無い場合は、文字列のコピーさえ行われないのでほとんど無駄が無い。
BOOL MySetWindowTextW(HWND hWnd, const WCHAR* wtext)
{
return ::SetWindowText(hWnd, CW2CT(wtext)); // SetWindowTextW()は9xで使えないため
}
ファイルパス操作をするための CStringT ラッパー。
shlwapi に含まれる、Path*関数群をクラス化している。
また、スタティック関数として、ATLPath namespace内に別名が定義されている。
(PathAddExtensionA ⇒ ATL::ATLPath::AddExtension() など)
正規表現。 ただ、必ずCRTを使用するという部分が、CStringT との互換性が取れていない面で設計ミスか? (正規表現を使用するような場合は大抵CRTを使う必要があるとは思うが)
どれもデフォルトでoperator T*が定義されているのがSTL/Boostのポインタとの最大の違いかと。
明示的に破棄するためのメソッドがそれぞれ違うのが気に入らない?
破壊式コピーポインタ。メソッドは、Attach(), Detach(), Free()。
配列に対するポインタ。通常の配列のほかに、可変長構造体のメモリ確保にも便利。 メソッドは、Allocate(), Reallocate(), AllocateBytes(), ReallocateBytes(), Free()。
業界標準COMポインタ。メソッドは、Attach(), Detach(), Release()。
CloseHandle()できるハンドルが対象。無効ハンドルはNULLのみ;INVALID_HANDLE_VALUEが使われるものに使用する場合は注意。 メソッドは、Attach(), Detach(), Close()。
さすがにSTLコレクションにと比べると貧弱。CRTを使用しない場合のみ、使う価値があるか?
メンバ関数は貧弱なものの、INARGTYPEとOUTARGTYPEを定義することで、破壊式コピーポインタ(auto_ptr)に対応している。
_ATL_MIN_CRT 環境では、VC7付属のSTLではリンクエラーになるので、これを使わざるを得ない。
その際、慣れ+std::algorithm のために、std::vector 互換メンバを追加してみた(Array.h)。
ファイルハンドルのラッパー。 64bit単位で扱え、Low, Highを意識しなくて済む。 テンポラリファイルは、Close()時に名前を与えた場合はその名前にリネームされ、与えない場合は削除される。
メモリマップトファイル。 いろいろな使い方はあるが、ただ単にファイルを読み込むのに使っても便利。
struct BitmapFile
{
BITMAPFILEHEADER header;
BITMAPINFO info;
BYTE* getBits() { return (BYTE*)this + header.bfOffBits; }
};
CAtlFile file;
file.Create("image.bmp", GENERIC_READ, 0, OPEN_EXISTING);
CAtlFileMapping<BitmapFile> mapping;
mapping.MapFile(file);
BitmapFile* bmp = static_cast<BitmapFile*>(mapping);
すべてのウィンドウ関係のAPIをラッピングし、
CenterWindow(), ResizeClient() などの便利なメソッドも追加されています。
インテリセンスを機能させるためだけでも利用価値があります。
ATL7.0より、グローバル変数 CComModule _Module を宣言しなくてもCWindowImplが使用可能になりました。
(内部的には _AtlBaseModule, _AtlWinModule を含むライブラリが自動的にリンクされます。)
非常に軽量のライブラリなので、単にウィンドウを出すような場面(=ほとんどすべてのWin32プログラム)ではいつでも使えるでしょう。
誰もが一度は苦労するHWNDのクラス化を、Thunkingという面白い手法で実現しています。
VC7のスケルトンと同等なコードの例
2004/02/09