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

 

 

第3回は、先日リリースされた WTL 7.1 についてその相違などを調査しました。
公式には非サポートとなっている WTL ですが、Windows CE も対象になったし、これからも開発を続けて欲しいですね。・・・って講座じゃないかも

今回のポイント
WTL 7.1 の変更点を理解しよう!

  • WTL 7.1

  • ダウンロードはこちらから。

    今回は何が変わったのだろうか?詳細は WTL7.1.exe を展開したあとの Readme.htm に書いてあるし、ソースを見てください。

    • Visual Studio.net 2003 正式対応

    • AppWizard を Visual Studio.net で利用できるようになった(パッチとかしなくても)

    • VC 7.0 への適合、ATL 7.0 の新しいモジュールクラス、クリティカルセクションのサポート

    • Windows CE プラットフォームのサポート

    • その他、バグ修正など

    ということになっています。

    ま、あまり濃い使い方をしていない限りはほとんど変わっていません。実際リビルドも何の問題も無く通ってしまいます。では、その詳細に少し触れてみたいと思います。

  • 変更点は?

    まず、ソース全体を diff して気づくことが何点かあるのですが、その一つ目は namespace の問題です。

    「以前から WTL という namespace だったじゃん」って感じなんですが、いくつかの ATL のクラスが namespace ATL を利用するようになっています。

    たとえば、CComModule、CWindow に始まり、CSimpleArray、_U_STRINGorID などが ATL の namespace に収められました。WTL 7.1 を入れるとクラスビューがこんな感じになります。

    次に目立つのは Windows CE に対応した部分です。

    _WIN32_WCE という値で条件定義してある部分が結構あります。

    それから小さいことではありますが、初期化していない構造体の初期化があげられます。

BOOL SetItemState(int nItem, UINT nState, UINT nStateMask)
{
  ATLASSERT(::IsWindow(m_hWnd));
  LVITEM lvi = { 0 };
  lvi.state = nState;
  lvi.stateMask = nStateMask;
  return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi);
}

また、以前は Atlapp.h にあった _U_RECT、_U_STRINGorID、_U_MENUorID といったクラスや、いくつかのマクロが、AtlWinx.h というファイルに移りました。このヘッダは 7.1 で始めて追加されたものですが、内容は以前と同じものです(CE 対応とか namespace とかが違うかもしれませんが)

それから、上記の構造体の初期化のように小さな?変更ですが、メンバ変数への代入が直接ではなく、Attach などのメソッド経由で行われるように改良されています。

こっちが以前の CPen の operator = と Attach

CPenT<t_bManaged>& operator=(HPEN hPen)
{
  m_hPen = hPen;
  return *this;
}

void Attach(HPEN hPen)
{
  if(t_bManaged && m_hPen != NULL)
    ::DeleteObject(m_hPen);
  m_hPen = hPen;
}
CPenT& operator =(HPEN hPen)
{
  Attach(hPen);
  return *this;
}

void Attach(HPEN hPen)
{
  if(t_bManaged && m_hPen != NULL && m_hPen != hPen)
    ::DeleteObject(m_hPen);
  m_hPen = hPen;
}

また、メッセージループ Run() の改良や、CString のバッファオーバーランなどの問題も解決されているようです。まあ、細かいことを私なんかがこちゃこちゃ言うよりも、以下に変更点の日本語訳を載せて起きます。

  • 7.0 からの変更点 (Readme.htm の日本語訳:一部)

    8. WTL 7.1 と 7.0 の変更点

     

    新規、および改良点

    • VC7 への対応:ATL 7.0 のモジュールクラス、クリティカルセクション、VC 7.1 対応の AppWizard 用 Setup

    • Windows CE への対応: Windows CE プラットフォームへの完全対応。
      eMbedded Visual C++ 用の AppWizard

    • Namespace への対応: デフォルトで using namespace WTL を定義していたのを中止(_WTL_NO_AUTOMATIC_NAMESPACE を参照)

    • CHyperLink の新機能:下線なし、ホバー時に下線、コマンドボタン、リンクタグ

    • CCustomWaitCursor クラス:カスタム、またはアニメーションウェイトカーソルのサポート

    • AtlCreateBoldFont() :既存フォントのボールド版を作成

    修正、および強化

    CFrameWindowImpl:

    • CreateSimpleToolBarCtrl() :デッドコードの除去、エラーチェック強化、グローバル関数の追加(AtlCreateSimpleToolBar)

    • 修正 - PrepareChevronMenu() :Unicode のツールバー文字列を取得できない問題

    • CFrameWindowImplBase::Create() - m_hWnd が使われていないときに作成に失敗するように ASSERT を改良(atlframe.h 459行目)

    • 修正 - CFrameWndClassInfo::Register - _WIN32_WINNT >= 0x0500 or for _WIN64 が定義されているときだけ、%p フォーマットが使えるように

    • 修正 - RTL(右から左へ文字を書くモード)のときに Chevron メニューが正しく配置されない問題の修正

    • 修正 - CMDIChildWindowImpl: 子ウィンドウを最大化して作成したときと、フォーカスの扱いの問題

    • 修正 - CMDIChildWindowImpl: WM_MOUSEACTIVATE メッセージでアクティブになるように

     UpdateUI:

    • 修正 - 間違ってMDI アプリケーションのシステムメニューからデフォルトアイテムを削除していた問題

    • int の代わりに bool を引数にした UISetCheck メソッドを追加
       

    DDX:

    • 修正 - 小数点精度の変換を提供していなかった問題

    • 非 CWindowImpl オブジェクト用の DDX_CONTROL_HANDLE の追加

    • チェックステート用の int ではなく bool の DDX_Check 変数の追加
       

    Command Bar:

    • 修正 - オーナードローメニューアイテムに対して、OnDrawItem() と OnMeasureItem() がきちんとチェックしていなかった問題

    • 修正 - 3D メニューモードで、32ビットの無効イメージ(Disabled)が正しく描画されなかった問題

    • 修正 - RTL(右から左へ文字を書くモード)のときに、ポップアップメニューが正しく配置されない問題

    • 修正 - GetClassLongPtr() で GCLP_HICONSM ではなく、GCL_HICONSM を使うように

     

    MDI Command Bar:

    • 修正 - MDI 子ウィンドウが異なる場合にアイコンが再描画されない

    • OnAllHookMessages() - MDI 子ウィンドウのクラスアイコンを扱えるように改良

    • 修正 - OnNcLButtonDown() が Windows のバージョンをチェックしないでTPM_VERPOSANIMATION を使っていた

    • 修正 - RTL(右から左へ文字を各モード)で最大化した MDI のボタンがおかしな位置にある問題

    • IE4 の Rebar のバンドの cxIdeal を調整

    • Rebar バンドの ideal size によって異なるトップレベルのメニューへのサポートを追加

     

    AppWizard:

    • 修正 - MSDI(Multi thread SDI) アプリケーションを COM Server にできない

    • 修正 - Form View を持った MDI アプリケーションが、最大化した MDI 子ウィンドウを閉じるときに stack overflow していた問題

    • 修正 - リソースのバージョン情報を、プロジェクト名に関係なく ’test1' という名前で作成していた

    • 修正 - ActiveX コントロールをホスティングするダイアログプロジェクトが、CAxDialogImpl を継承しない

    • 修正 - COM Server がタイプライブラリを登録しない

    • 修正 - COM Server が AppID プロパティを登録しない

     

    CTreeViewCtrl:

    • 修正 - GetItemData() の戻り値をもっと適切に

    • 修正 - GetItemState() が IE5 では TVM_GETITEM ではなくTVM_GETITEMSTATE を使うように

    • GetItem() and SetItem() - TVITEMEX を使う新しい変数を追加

    • 修正 - SortChildren() に再帰フラグの引数を追加

    • 修正 - CTreeItem が CWindow 以外の TBase を持つ CTreeViewCtrlExT だったときをサポートしていなかった

     

    CThemeImpl:

    • 修正 - ポインタではなく配列を削除するように

    • 修正 - EnableThemeDialogTexture() の引数を BOOL ではなく DWORD に

     

    CFolderDialog:

    • 修正 - EnableOK() が BFFM_ENABLEOK(SendMessage) に誤った引数を渡していた

    • 修正 - メッセージのネスト問題を引き起こすので、m_hWnd を常にクリアするように

     

    CDialogResize:

    • 修正 - DlgResize_Init() が、SetRedraw() うを使っていたので、強制的にダイアログを表示していた

    • WS_THICKFRAME スタイルがリサイズダイアログの作成に不十分だった

    • Min track size も子ダイアログと同じように使うべきだった

    • 修正 - DlgResize_PositionControl() が MapWindowPoints() の戻り値を間違ってチェックしていた

     

    CAppModule:

    • 修正 - CAppModule メソッドがスレッドセーフではなかった

    • 修正 - AddSettingChangeNotify() が遅延初期化していたので、マルチスレッドアプリケーションで使えなかった

     

    CString:

    • 修正 - Delete() が文字の長さ以上の削除を許可しなかった

    • 修正 - Append() がバッファオーバーランを起こす可能性があった

    • 修正 - MakeReverse() が無限ループを引き起こす可能性があった

    • 修正 - _cstrstr() 不必要に効率が悪い

    • 修正 - FindOneOf() が DBCS を認識できない

    • 修正 - Format() が %E を認識しない

    • 修正 - TrimLeft() と TrimRight() が DBCS を正しく扱えない

    • 修正 - SBCS でアサーションまたは未定義の動作を引き起こすかもしれない

     

    CRecentDocumentList:

    • 修正 - SetMaxEntries() が不適切な ASSERT

    • GetFromList() メソッドに CString の変数を追加

    • MRU list をコマンド ID を使って置き換える方法を追加

    • レジストリをキー名で置き換える方法の追加

     

    Misc:

    • CMessageLoop::Run() - PeekMessage() を呼ぶ前に bDoIdle をチェックするように改良

    • CServerAppModule: 不要なコードを削除

    • 修正 - CServerAppModule::MonitorProc() - 不必要な _endthreadex() の呼び出し

    • 修正 - CListBox::GetText() と CComboBox::GetLBText() で(CString の変数) LBERR/CB_ERR をチェックしていなかった

    • 修正 - CAxPropertyPageImpl が ATL 7.0 で ActiveX コントロールを作成できなかった

    • 修正 - CDC::GetTextExtentExPoint() が無かった

    • CDC::SetWindowExt() lpSizeRet 引数のデフォルト値を NULL にすべきだった

    • 修正 - CPropertySheetWindow で PSM_INSERTPAGE, PSM_SETHEADERTITLE, PSM_SETHEADERSUBTITLE に対応するメソッドが無かった、さらに AddPage は BOOL を返すべきだった

    • 修正 - CMapScrollImpl::SetScrollSize() 間違った変数(xMin)を使っていた

    • 修正 - CHyperLink: WM_UPDATEUISTATE が WM_PAINT なしで再描画をしていた

    • 修正 - CUpDownCtrl::GetPos() が不正な値を返していた

    • 修正 - CUpDownCtrl::GetPos32() で引数のデフォルト値が無かった

    • 修正 - CMultiPaneStatusBarCtrl:常に特定のペインのサイズグリップを使っていた

    • 修正 - CTabCtrl::InsertItem() BOOL ではなく int を返すべきだった

    • CReBarCtrl: LockBands() メソッドの追加

    • 修正 - CFont: DPtoLP に初期化していない変数を渡していた

    • 修正 - CPrintDialogImpl: 印刷設定ダイアログを表示したときにクラッシュする

    • 修正 - CPageSetupDialogImpl::PaintHookProc() - T* を使って、UINT ではなくUINT_PTR を返すべきだった

    • 修正 - CPrintJob ファイルの印刷をサポートしていなかった

    • 修正 - CSplitterImpl: WM_CAPTURECHANGED に対応していなかった- 不正な状態を取得する可能性があった

    • CRichEditCtrl: EM_SETTABSTOPS に対応するメソッドの追加

    • 修正 - CFindFile::GetFilePath() \ をチェックしていたが、指定できなかった

     

    General:

    • 修正 - /Zc:forScope (for ループのスコープの強制準拠)オプションでコンパイルしたときの問題

    • Pixel サイズやバッファサイズにマジックナンバーではなく名前のついた定数を使うように

    • Managed C++ (/CLR)でのビルドをサポート

    • CMenuItemInfo - 異なるバージョンの Windows でのランタイムサポートの追加

    • CommCtrl.h の変更 - IMAGELISTDRAWPARAMS にフィールドを追加し、_WIN32_WINNT の代わりに _WIN32_IE に依存するように

    • 修正 - CRegKey::QueryStringValue() を誤って使っていた

    • 修正 - GDI と USER のラッパーで、ハンドルを変数で管理している場合に Operator = でハンドルがリークする

    • 修正 - GDI and USER のラッパーが自己割り当てで使えなくなる

    • 修正 - ATL7 で使えなくなったメッセージチェインのマクロ

    • すべての変数と構造体を使う前に初期化

    • 新しいコモンコントロールの構造体の名前を使うように

    ・・・疲れた。おかしいところがあったら教えてくださるとうれしいです。

    第4回へ

最終更新日 : 2004/08/09