ATL 2.1 は Visual C 5.0 コンパイラ用に最適化されています。特に、多くの ATL クラスで宣言されていることがあります、 ATL_NO_VTABLE マクロ:
aTL_NO_VTABLE CComControl クラスします。{特価;...}(&N)
ATL 定義 ATL_NO_VTABLE は次のとおり:
#ifdef _ATL_DISABLE_NO_VTABLE特価;#define ATL_NO_VTABLE# 他#define ATL_NO_VTABLE __declspec(novtable)#endif(&N)
場合 _ATL_DISABLE_NO_VTABLE が定義されていない、 ATL_NO_VTABLE マクロを展開する declspec(novtable) 。場合 declspec(novtable) 使用クラス宣言は vtable ポインター クラスのコンス トラクターとデストラクターの初期化からできません。リンカーがこのように、vtable をなくすことができます、すべての関数に指摘、vtable によっては、最派生クラス (通常はccomobject から、 CComAggObject、またはCComPolyObject) 使用していない提供 declspec(novtable) と vtable ポインターを正しく初期化するため。
既定では、ATL オブジェクト ウィザード新しいクラスが生成されます、 ATL_NO_VTABLE マクロ。上記のとおり、 declspec(novtable) 属性は直接作成されない基本クラスでのみ使用する必要があります。さらに、それを使用して、オブジェクトのコンス トラクターから仮想関数を呼び出すには安全ではない declspec(novtable) 。こうしたFinalConstructメソッドに呼び出しを移動する必要があります。
かどうか使用する必要がありますかわからない場合は、 declspec(novtable) 属性、削除できる、 ATL_NO_VTABLE マクロから任意のクラスの定義をグローバルに無効それを指定して #define _ATL_DISABLE_NO_VTABLE stdafx.h では、前に他のすべての ATL にはヘッダー ファイルが含まれます。