Impostazione dell'ottimizzazione del compilatore per un progetto ATL
Per impostazione predefinita, la Creazione guidata controllo ATL genera nuove classi con la macro ATL_NO_VTABLE, come riportato di seguito:
class ATL_NO_VTABLE CProjName
{
...
};
Viene quindi definita la macro _ATL_NO_VTABLE nel seguente modo:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Se non si definisce _ATL_DISABLE_NO_VTABLE, la macro ATL_NO_VTABLE si espande come declspec(novtable). L'utilizzo di declspec(novtable)in una dichiarazione di classe impedisce quindi l'inizializzazione del puntatore vtable nel costruttore e nel distruttore della classe. Quando viene compilato il progetto, il linker elimina il puntatore vtable e tutte le funzioni a cui fa riferimento.
È necessario utilizzare ATL_NO_VTABLE e declspec(novtable) solo con le classi base non creabili direttamente. Il modificatore declspec(novtable) non deve invece essere utilizzato con la classe derivata di livello più basso del progetto, poiché questa (in genere CComObject, CComAggObject o CComPolyObject) inizializza il puntatore vtable per il progetto.
Le funzioni di tipo virtual non devono essere chiamate dal costruttore di un oggetto che utilizza declspec(novtable). È quindi opportuno spostare le chiamate al metodo FinalConstruct.
Se non si è certi dell'utilizzo del modificatore declspec(novtable), è possibile rimuovere la macro ATL_NO_VTABLE da qualsiasi definizione di classe oppure disabilitarla a livello globale specificando
#define _ATL_DISABLE_NO_VTABLE
in stdafx.h, prima di includere gli altri file di intestazione ATL.
Vedere anche
Attività
Creazione di progetti tramite le creazioni guidate applicazioni
Riferimenti
Creazione guidata progetto ATL
Fundamentals of ATL COM Objects
Configurazioni predefinite di progetti ATL