ATLとMFCの変更点 from ver.7.0

ATL と MFC の変更点 : ATL 7.0 と MFC 7.0
MFCに絡む部分だけ抜粋

  • dllの互換性。

Visual C++ .NET の ATL と MFC のクラスは、以前のリリースの同じクラスとバイナリ互換性がありません。このため、mfc42.dll を使用してビルドしたソース コードは、Visual Studio .NET でビルドし直す必要があります。また、アプリケーションで使用する DLL ファイルや LIB ファイルも、Visual Studio .NET でビルドし直す必要があります。

これは普通やってる。ので問題なし。

CException は、MFC (Microsoft Foundation Class) ライブラリ内のすべての例外に関する基本クラスです。現在の CException は抽象基本クラスであるため、CException オブジェクトを直接作成することはできません。派生クラスのオブジェクトを作成する必要があります。オブジェクトを直接作成すると、エラーが発生します。

派生クラス作らなきゃいけないのかぁ。めんどくさい。

  • CStringクラス

CString に UNICODE バージョンと ANSI バージョン (CStringW と CStringA) ができました。

例えば、CStringから文字列を取り出すようなコーディングしている場合は要注意。古いVS6のソースの改修でプロジェクトを再作成した場合は要注意(デフォルトの文字コード設定がUNICODEになってたりするから)。

CTime クラス は、基になる __time64_t データ型を使用します。MFC 6.0 では、CTime は 32 ビット型であった time_t データ型を使用していました。この変更の理由は、2038 年 1 月 19 日の 3:14:07 より先の時刻をサポートするためです。

倍ですか、サイズ。何気にきつい変更。

  • CWnd::DestroyWindowでToolTipsを表示すると発生するアサーション対策のためのメンバ変数の変更

DestroyWindowでToolTips表示するシチュエーションがよくわからないのですが、とにかくアサーション発生しなくなった、と。乙。

  • BOOL型ではなくbool型であるブール式
class CMyClass : public CObject
{
   BOOL bFlag;
   void Serialize (CArchive& ar))
   {
      if (ar.IsStoring())
         ar << (bFlag != FALSE); // breaking change
      else
         ar >> bFlag;
   }
};

上記のようなコードで、bFlag != FALSE は、

    • .NETより前::4 byteで評価(int型のtypedef)
    • .NET以降::boolとして評価(1 byte)

される。よって、結果をアウトプットする際には、型に応じたキャストが必要(この場合はBOOL)。何気に知っておいたほうがよさげなトリビア系情報。

  • CColorPropPageとCFontPropPageの削除

CLSID_StockColorPageとCLSID_StockFontPageを代わりに使う。msstkprp.dllが別途必要になる。

  • ON_MESSAGE の変更点

ON_MESSAGE マクロの関数パラメータは、afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM) 型と一致する必要があります。

ウィザードで生成されたON_MESSAGEの引数に「&」がくっついていてたのはこれだったのか。

  • OLE DBテンプレートの変更点

なんか、いろいろ。変更というよりは新装オープン。