Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Domyślnie Kreator kontrolek ATL generuje nowe klasy za pomocą makra ATL_NO_VTABLE w następujący sposób:
class ATL_NO_VTABLE CProjName
{
...
};
Następnie ATL definiuje _ATL_NO_VTABLE w następujący sposób:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Jeśli nie zdefiniujesz _ATL_DISABLE_NO_VTABLE, makro ATL_NO_VTABLE zostanie rozwinięte do declspec(novtable). Użycie declspec(novtable)w deklaracji klasy uniemożliwia zainicjowanie wskaźnika vtable w konstruktorze klasy i destruktorze. Podczas kompilowania projektu konsolidator eliminuje tabelę wirtualną i wszystkie funkcje, do których wskazuje tabela wirtualna.
Należy użyć ATL_NO_VTABLE, a w związku z tym declspec(novtable)tylko klas bazowych, które nie są bezpośrednio creatable. Nie można używać declspec(novtable) z najbardziej pochodną klasą w projekcie, ponieważ ta klasa (zazwyczaj CComObject, CComAggObject lub CComPolyObject) inicjuje wskaźnik vtable dla projektu.
Nie można wywoływać funkcji wirtualnych z konstruktora dowolnego obiektu używającego metody declspec(novtable). Należy przenieść te wywołania do metody FinalConstruct .
Jeśli nie masz pewności, czy należy użyć declspec(novtable) modyfikatora, możesz usunąć makro ATL_NO_VTABLE z dowolnej definicji klasy lub można ją globalnie wyłączyć, określając
#define _ATL_DISABLE_NO_VTABLE
w pliku pch.h (stdafx.h w programie Visual Studio 2017 lub starszym), zanim zostaną uwzględnione wszystkie inne pliki nagłówków ATL.
Zobacz też
Kreator projektu ATL
Typy projektów języka C++ w programie Visual Studio
Programowanie za pomocą kodu ATL i C Run-Time
Podstawowe informacje na temat obiektów COM ATL
novtable
Domyślne konfiguracje projektu ATL