TOP / CODING / APP / LINK / NOTE / MAIL

WTL/ATLのマクロ

ここでは実装切り換え用のマクロ定義(#ifや#ifdefなどで使われるもの)について書きます。

皆さん、Windowsプログラミングでは

などやWindows.hにコメントされているマクロを#defineしたり、

などで実装を切り換えたりしていることと思います。 これら以外にも対象のプラットフォームを識別するマクロ、 コンパイラやそのバージョンを識別するマクロ、 他のライブラリやそのどのバージョンを同時に使っているかを識別するマクロなど、 様々なマクロで実装が切り換えられるように普通のライブラリは作られています。 WTL/ATLもご多分にもれず、そのように書かれています。

そこで、WTL/ATLで使われるマクロを一覧してみました。 これらをうまく使えば、コンパイル時間の短縮、誤った実装の見過ごし防止、 名前の衝突の防止、などに活用できます。マクロを定義しなければ実装されない機能もあります。 ATLのマクロについては、WTLに関係するもの、私がよく使う一部のものについてしかリストアップしていません。 かなりたくさんあるので、詳しくは こちらをご覧ください。 WTLでのマクロがATL中に登場することはないでしょうが、ATLのマクロがWTLで使われることはあります。 また、足りないものを見つけたらご連絡くださるとありがたいです。

マクロ 説明
ATL
_ATL_MIN_CRT ATLで極力CRTを使わないようにする。最低限のCRT(atlmincrt.lib)を使う
_ATL_NO_DEFAULT_LIBS ATLヘッダでデフォルトライブラリのリンクを指定しない(#pragma comment(lib, "xxx.lib")を使わない)
_ATL_NO_COM_SUPPORT ATLソース中のCOMサポート部分を使用しない
_ATL_NO_HOSTING ActiveXコントロールをホストしない(ホストに関係するクラスを定義しない)
ATL_NO_LEAN_AND_MEAN atldef.hで自動的に WIN32_LEAN_AND_MEAN と NOMCX が定義されるのを防ぐ
_ATL_NO_COMMODULE CComModule とそれに関するクラス/関数を定義しない
_ATL_SINGLE_THREADED
_ATL_APARTMENT_THREADED
_ATL_FREE_THREADED
使用するスレッドモデルを定義する。どれか一つ。定義しなければatldef.hにて_ATL_FREE_THREADEDになる。
_ATL_ATTRIBUTES 属性付きATLプログラミングをサポートする
_ATL_NO_AUTOMATIC_NAMESPACE using namespace ATL; を書かない
_ATL_NO_PRAGMA_WARNINGS #pragma warning(disable: xxxx)でwarningを消すのをやめる
_ATL_DISABLE_NO_VTABLE それぞれATL_xxxマクロを空定義にする
_ATL_DISABLE_NOTHROW
_ATL_DISABLE_FORCEINLINE
_ATL_DISABLE_NOINLINE
_ATL_NO_DEBUG_CRT crtdbg.h をインクルードしない。ただし、ATLをコンパイルするためにはATLASSERTを自分で定義する必要がある。
_ATL_CSTRING_NO_CRT CAtlString(非MFC環境ではCStringと同じ)がCRTを使わない実装になる。 _ATL_MIN_CRTが定義されていると自動的に定義される。
_ATL_NO_EXCEPTIONS ATLでデフォルトの例外処理(CAtlExceptionをthrowする)を使わない。 _ATL_CUSTOM_THROWを定義してAtlThrowを作っていなければエラー時に落ちる (ATLASSERT or RaiseException())簡易AtlThrowが使われる。
_ATL_CUSTOM_THROW 自前のAtlThrow()を書くときに使用
WTL
_ATL_NO_COM WTLソース中のCOMサポート部分を使用しない
_WTL_NO_CSTRING WTL::CString を使わない(クラスを定義しない)
_WTL_NO_WTYPES WTL::CSize, WTL::CPoint, WTL::CRect を定義しない
_WTL_NO_UNION_CLASSES WTL::_U_RECT, WTL::_U_MENUorID, WTL::_U_STRINGorID を定義しない。(WTL7.0にのみ存在。WTL7.1ではATLのバージョンが7.0以上だとこれらのクラスは定義されなくなりました。)
_ATL_NO_OLD_NAMES 旧バージョンとの互換性のためのCUpdateUIObject、DoUpdateを定義しない
_ATL_NO_MSIMG atlgdi.h でMSIMG関係の定義をしない。#pragma comment(lib, "msimg32.lib")を書かない
_ATL_NO_OPENGL atlgdi.h でOpenGL関係の定義をしない。#pragma comment(lib, "opengl32.lib")を書かない
_WTL_NO_AUTOMATIC_NAMESPACE using namespace WTL; を書かない
_WTL_NO_AUTO_THEME CMDICommandBarCtrlImplにXPテーマに関する実装をしない
_ATL_NO_REBAR_SUPPORT リバーをサポートしない
_CMDBAR_EXTRA_TRACE WTLのコマンドバークラスで各箇所にトレースが定義される。
_WTL_NEW_PAGE_NOTIFY_HANDLERS CPropertyPageImplで新しいタイプの通知ハンドラ(有効な戻り値を通常のメッセージ処理と同等になるよう拡張)を使う
_ATL_NO_OLD_HEADERS_WIN64 古いヘッダ(ATL7.0より前)を使っているときに、64bit互換のAPIやマクロが定義されるのを防ぐ
_WTL_FORWARD_DECLARE_CSTRING CString の前方宣言(前方参照)をする。 atluser.h や atlgdi.h でCString関係の部分を使えるようにするために必要。 こちらも参考に。
_ATL_USE_DDX_FLOAT DDXで浮動小数点数型(float/double)を使えるようにする
_ATL_USE_CSTRING_FLOAT WTL::CString の書式指定メソッドで浮動小数点数を有効にする
_ATL_USE_NEW_PRINTER_INFO atlprint.h で新しいPRINTER_INFO(PRINTER_INFO_8, PRINTER_INFO_9)を使えるようにする
_WTL_NO_THEME_DELAYLOAD atltheme.h をインクルードするときにVC7以前のバージョンでuxtheme.dllが自動的に遅延ロードにされるのを防ぐ
2004-03-18

to the Top of this page