Usługi modelu obiektów czasu wykonywania
Klasy CObject
i CRuntimeClass
hermetyzują kilka usług obiektów, w tym dostęp do informacji o klasie czasu wykonywania, serializacji i tworzenia obiektów dynamicznych. Wszystkie klasy pochodzące z CObject
dziedziczą tę funkcję.
Dostęp do informacji o klasie czasu wykonywania umożliwia określenie informacji o klasie obiektu w czasie wykonywania. Możliwość określenia klasy obiektu w czasie wykonywania jest przydatna, gdy potrzebujesz dodatkowego sprawdzania typów argumentów funkcji i kiedy należy napisać kod specjalnego przeznaczenia na podstawie klasy obiektu. Informacje o klasie czasu wykonywania nie są obsługiwane bezpośrednio przez język C++.
Serializacja to proces zapisywania lub odczytywania zawartości obiektu do lub z pliku. Serializacji można używać do przechowywania zawartości obiektu nawet po zakończeniu działania aplikacji. Następnie można odczytać obiekt z pliku po ponownym uruchomieniu aplikacji. Mówi się, że takie obiekty danych są "trwałe".
Tworzenie obiektu dynamicznego umożliwia utworzenie obiektu określonej klasy w czasie wykonywania. Na przykład obiekty dokumentów, widoków i ramek muszą obsługiwać tworzenie dynamiczne, ponieważ struktura musi je dynamicznie tworzyć.
W poniższej tabeli wymieniono makra MFC, które obsługują informacje o klasie czasu wykonywania, serializacji i tworzenie dynamiczne.
Aby uzyskać więcej informacji na temat tych usług obiektów w czasie wykonywania i serializacji, zobacz artykuł CObject
Klasa: uzyskiwanie dostępu do informacji o klasie czasu wykonywania.
Makra usług modelu obiektów w czasie wykonywania
Nazwa/nazwisko | opis |
---|---|
DECLARE_DYNAMIC |
Umożliwia dostęp do informacji o klasie czasu wykonywania (musi być używany w deklaracji klasy). |
DECLARE_DYNCREATE |
Umożliwia dynamiczne tworzenie i dostęp do informacji o klasie czasu wykonywania (musi być używany w deklaracji klasy). |
DECLARE_SERIAL |
Umożliwia serializacji i dostęp do informacji o klasie czasu wykonywania (musi być używany w deklaracji klasy). |
IMPLEMENT_DYNAMIC |
Umożliwia dostęp do informacji o klasie czasu wykonywania (musi być używany w implementacji klasy). |
IMPLEMENT_DYNCREATE |
Umożliwia dynamiczne tworzenie i dostęp do informacji w czasie wykonywania (muszą być używane w implementacji klasy). |
IMPLEMENT_SERIAL |
Zezwala na serializacji i dostęp do informacji o klasie czasu wykonywania (musi być używany w implementacji klasy). |
RUNTIME_CLASS |
CRuntimeClass Zwraca strukturę odpowiadającą nazwanej klasie. |
Funkcja OLE często wymaga dynamicznego tworzenia obiektów w czasie wykonywania. Na przykład aplikacja serwera OLE musi być w stanie dynamicznie tworzyć elementy OLE w odpowiedzi na żądanie od klienta. Podobnie serwer automatyzacji musi mieć możliwość tworzenia elementów w odpowiedzi na żądania klientów automatyzacji.
Biblioteka klas programu Microsoft Foundation udostępnia dwa makra specyficzne dla ole.
Dynamiczne tworzenie obiektów OLE
Nazwa/nazwisko | opis |
---|---|
AFX_COMCTL32_IF_EXISTS |
Określa, czy biblioteka Common Controls implementuje określony interfejs API. |
AFX_COMCTL32_IF_EXISTS2 |
Określa, czy biblioteka Common Controls implementuje określony interfejs API. |
DECLARE_OLECREATE |
Umożliwia tworzenie obiektów za pomocą automatyzacji OLE. |
DECLARE_OLECTLTYPE |
GetUserTypeNameID Deklaruje funkcje składowe i GetMiscStatus klasy kontrolnej. |
DECLARE_PROPPAGEIDS |
Deklaruje, że kontrolka OLE udostępnia listę stron właściwości do wyświetlania jej właściwości. |
IMPLEMENT_OLECREATE |
Umożliwia tworzenie obiektów przez system OLE. |
IMPLEMENT_OLECTLTYPE |
Implementuje GetUserTypeNameID funkcje składowe i GetMiscStatus klasy sterującej. |
IMPLEMENT_OLECREATE_FLAGS |
To makro lub IMPLEMENT_OLECREATE musi zostać wyświetlone w pliku implementacji dla dowolnej klasy, która używa klasy DECLARE_OLECREATE . |
AFX_COMCTL32_IF_EXISTS
Określa, czy biblioteka Common Controls implementuje określony interfejs API.
Składnia
AFX_COMCTL32_IF_EXISTS( proc );
Parametry
proc
Wskaźnik do ciągu zakończonego wartością null zawierającego nazwę funkcji lub określa wartość porządkową funkcji. Jeśli ten parametr jest wartością porządkową, musi znajdować się w wyrazie o niskiej kolejności; wyraz o wysokiej kolejności musi być zerowy. Ten parametr musi być w standardzie Unicode.
Uwagi
Użyj tego makra, aby określić, czy biblioteka wspólnych kontrolek funkcja określona przez proc
(zamiast wywoływać funkcję GetProcAddress
.
Wymagania
afxcomctl32.h
, afxcomctl32.inl
AFX_COMCTL32_IF_EXISTS2
Określa, czy biblioteka Common Controls implementuje określony interfejs API (jest to wersja Unicode programu AFX_COMCTL32_IF_EXISTS
).
Składnia
AFX_COMCTL32_IF_EXISTS2( proc );
Parametry
proc
Wskaźnik do ciągu zakończonego wartością null zawierającego nazwę funkcji lub określa wartość porządkową funkcji. Jeśli ten parametr jest wartością porządkową, musi znajdować się w wyrazie o niskiej kolejności; wyraz o wysokiej kolejności musi być zerowy. Ten parametr musi być w standardzie Unicode.
Uwagi
Użyj tego makra, aby określić, czy biblioteka wspólnych kontrolek funkcja określona przez proc
(zamiast wywoływać funkcję GetProcAddress
. To makro jest wersją Unicode programu AFX_COMCTL32_IF_EXISTS
.
Wymagania
afxcomctl32.h
, afxcomctl32.inl
DECLARE_DYNAMIC
Dodaje możliwość uzyskiwania dostępu do informacji w czasie wykonywania o klasie obiektu podczas wyprowadzania klasy z CObject
klasy .
DECLARE_DYNAMIC(class_name)
Parametry
class_name
Rzeczywista nazwa klasy.
Uwagi
DECLARE_DYNAMIC
Dodaj makro do modułu nagłówka (.h
) dla klasy, a następnie dołącz ten moduł we wszystkich .cpp
modułach, które wymagają dostępu do obiektów tej klasy.
Jeśli używasz DECLARE_DYNAMIC
makr i IMPLEMENT_DYNAMIC
zgodnie z opisem, możesz użyć RUNTIME_CLASS
makra i CObject::IsKindOf
funkcji, aby określić klasę obiektów w czasie wykonywania.
Jeśli DECLARE_DYNAMIC
element jest uwzględniony w deklaracji klasy, IMPLEMENT_DYNAMIC
należy uwzględnić w implementacji klasy.
Aby uzyskać więcej informacji na temat makra DECLARE_DYNAMIC
, zobacz CObject
Tematy klasy.
Przykład
Zobacz przykład dla elementu IMPLEMENT_DYNAMIC
.
Wymagania
Nagłówek: afx.h
DECLARE_DYNCREATE
Umożliwia dynamiczne tworzenie obiektów klas pochodnych CObject
w czasie wykonywania.
DECLARE_DYNCREATE(class_name)
Parametry
class_name
Rzeczywista nazwa klasy.
Uwagi
Platforma używa tej funkcji do dynamicznego tworzenia nowych obiektów. Na przykład nowy widok utworzony podczas otwierania nowego dokumentu. Klasy dokumentów, widoków i ramek powinny obsługiwać tworzenie dynamiczne, ponieważ struktura musi je dynamicznie tworzyć.
DECLARE_DYNCREATE
Dodaj makro w .h
module dla klasy, a następnie dołącz ten moduł we wszystkich .cpp
modułach, które wymagają dostępu do obiektów tej klasy.
Jeśli DECLARE_DYNCREATE
element jest uwzględniony w deklaracji klasy, IMPLEMENT_DYNCREATE
należy uwzględnić w implementacji klasy.
Aby uzyskać więcej informacji na temat makra DECLARE_DYNCREATE
, zobacz CObject
Tematy klasy.
Uwaga
Makro DECLARE_DYNCREATE
zawiera wszystkie funkcje programu DECLARE_DYNAMIC
.
Przykład
Zobacz przykład dla elementu IMPLEMENT_DYNCREATE
.
Wymagania
Nagłówek: afx.h
DECLARE_OLECTLTYPE
GetUserTypeNameID
Deklaruje funkcje składowe i GetMiscStatus
klasy kontrolnej.
Składnia
DECLARE_OLECTLTYPE( class_name )
Parametry
class_name
Nazwa klasy sterującej.
Uwagi
GetUserTypeNameID
i GetMiscStatus
są czystymi funkcjami wirtualnymi zadeklarowanych w pliku COleControl
. Ponieważ te funkcje są czystą wirtualną, muszą zostać zastąpione w klasie kontrolnej. Oprócz DECLARE_OLECTLTYPE
polecenia należy dodać IMPLEMENT_OLECTLTYPE
makro do deklaracji klasy sterującej.
Wymagania
Nagłówek: afxctl.h
DECLARE_PROPPAGEIDS
Deklaruje, że kontrolka OLE udostępnia listę stron właściwości do wyświetlania jej właściwości.
Składnia
DECLARE_PROPPAGEIDS( class_name )
Parametry
class_name
Nazwa klasy sterującej, która jest właścicielem stron właściwości.
Uwagi
Użyj makra DECLARE_PROPPAGEIDS
na końcu deklaracji klasy. Następnie w .cpp
pliku, który definiuje funkcje składowe dla klasy, użyj BEGIN_PROPPAGEIDS
makra, wpisów makra dla każdej strony właściwości kontrolki i END_PROPPAGEIDS
makra, aby zadeklarować koniec listy stron strony właściwości.
Aby uzyskać więcej informacji na temat stron właściwości, zobacz artykuł Kontrolki ActiveX: strony właściwości.
Wymagania
Nagłówek: afxctl.h
DECLARE_SERIAL
Generuje kod nagłówka języka C++ niezbędny dla klasy pochodnej CObject
, którą można serializować.
DECLARE_SERIAL(class_name)
Parametry
class_name
Rzeczywista nazwa klasy.
Uwagi
Serializacja to proces zapisywania lub odczytywania zawartości obiektu do i z pliku.
Użyj makra DECLARE_SERIAL
w .h
module, a następnie dołącz ten moduł we wszystkich .cpp
modułach, które wymagają dostępu do obiektów tej klasy.
Jeśli DECLARE_SERIAL
element jest uwzględniony w deklaracji klasy, IMPLEMENT_SERIAL
należy uwzględnić w implementacji klasy.
Makro DECLARE_SERIAL
zawiera wszystkie funkcje i DECLARE_DYNAMIC
DECLARE_DYNCREATE
.
Makro służy AFX_API
do automatycznego eksportowania CArchive
operatora wyodrębniania dla klas używających DECLARE_SERIAL
makr i IMPLEMENT_SERIAL
. Nawias deklaracji klas (znajdujących się w .h
pliku) z następującym kodem:
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
// <your class declarations here>
#undef AFX_API
#define AFX_API
Aby uzyskać więcej informacji na temat makra DECLARE_SERIAL
, zobacz CObject
Tematy klasy.
Przykład
class CAge : public CObject
{
public:
void Serialize(CArchive& ar);
DECLARE_SERIAL(CAge)
// remainder of class declaration omitted
Wymagania
Nagłówek: afx.h
IMPLEMENT_DYNAMIC
Generuje kod C++ niezbędny dla dynamicznej CObject
klasy pochodnej z dostępem w czasie wykonywania do nazwy klasy i pozycji w hierarchii.
IMPLEMENT_DYNAMIC(class_name, base_class_name)
Parametry
class_name
Rzeczywista nazwa klasy.
base_class_name
Nazwa klasy bazowej.
Uwagi
Użyj makra IMPLEMENT_DYNAMIC
w .cpp
module, a następnie połącz wynikowy kod obiektu tylko raz.
Aby uzyskać więcej informacji, zobacz CObject
Tematy dotyczące klas.
Przykład
class CPerson : public CObject
{
DECLARE_DYNAMIC(CPerson)
// other declarations
};
IMPLEMENT_DYNAMIC(CPerson, CObject)
Wymagania
Nagłówek: afx.h
IMPLEMENT_DYNCREATE
Umożliwia dynamiczne tworzenie obiektów klas pochodnych CObject
w czasie wykonywania w przypadku użycia z makrem DECLARE_DYNCREATE
.
IMPLEMENT_DYNCREATE(class_name, base_class_name)
Parametry
class_name
Rzeczywista nazwa klasy.
base_class_name
Rzeczywista nazwa klasy bazowej.
Uwagi
Platforma wykorzystuje tę możliwość dynamicznego tworzenia nowych obiektów, na przykład podczas odczytywania obiektu z dysku podczas serializacji. IMPLEMENT_DYNCREATE
Dodaj makro w pliku implementacji klasy. Aby uzyskać więcej informacji, zobacz CObject
Tematy dotyczące klas.
Jeśli używasz DECLARE_DYNCREATE
makr i IMPLEMENT_DYNCREATE
, możesz użyć RUNTIME_CLASS
makra i CObject::IsKindOf
funkcji składowej, aby określić klasę obiektów w czasie wykonywania.
Jeśli DECLARE_DYNCREATE
element jest uwzględniony w deklaracji klasy, IMPLEMENT_DYNCREATE
należy uwzględnić w implementacji klasy.
Pamiętaj, że ta definicja makra wywoła domyślny konstruktor dla klasy. Jeśli konstruktor nietrywialny jest jawnie implementowany przez klasę, musi również jawnie zaimplementować konstruktor domyślny. Konstruktor domyślny można dodać do sekcji klasy private
lub protected
składowych, aby zapobiec wywoływaniu jej poza implementacją klasy.
Przykład
class CMyDynCreateObj : public CObject
{
int m_Num;
public:
DECLARE_DYNCREATE(CMyDynCreateObj)
CMyDynCreateObj(int Num) { m_Num = Num; }
private:
CMyDynCreateObj() { m_Num = 0; } // provide default constructor only for
// dynamic creation
};
IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)
Wymagania
Nagłówek: afx.h
IMPLEMENT_OLECREATE_FLAGS
To makro lub IMPLEMENT_OLECREATE
musi zostać wyświetlone w pliku implementacji dla dowolnej klasy, która używa klasy DECLARE_OLECREATE
.
Składnia
IMPLEMENT_OLECREATE_FLAGS( class_name, external_name, nFlags,
l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Parametry
class_name
Rzeczywista nazwa klasy.
external_name
Nazwa obiektu uwidoczniona innym aplikacjom (ujęta w cudzysłów).
nFlags
Zawiera co najmniej jedną z następujących flag:
afxRegInsertable
Umożliwia wyświetlenie kontrolki w oknie dialogowym Wstawianie obiektu dla obiektów OLE.afxRegApartmentThreading
Ustawia model wątków w rejestrze naThreadingModel=Apartment
wartość .afxRegFreeThreading
Ustawia model wątków w rejestrze naThreadingModel=Free
wartość .
Możesz połączyć dwie flagi afxRegApartmentThreading
i afxRegFreeThreading
ustawić element ThreadingModel=Both. Zobacz InprocServer32
w zestawie Windows SDK, aby uzyskać więcej informacji na temat rejestracji modelu wątków.
l
, w1
, w2
b4
b1
b3
b8
b2
b5
b6
b7
składniki klasy CLSID.
Uwagi
Uwaga
Jeśli używasz metody IMPLEMENT_OLECREATE_FLAGS
, możesz określić, który model wątków obsługuje obiekt przy użyciu parametru nFlags
. Jeśli chcesz obsługiwać tylko model pojedynczego bieżnika, użyj polecenia IMPLEMENT_OLECREATE
.
Nazwa zewnętrzna to identyfikator udostępniany innym aplikacjom. Aplikacje klienckie używają nazwy zewnętrznej do żądania obiektu tej klasy z serwera automatyzacji.
Identyfikator klasy OLE jest unikatowym 128-bitowym identyfikatorem obiektu. Składa się z jednego long
, dwóch **WORD
s i ośmiu **BYTE
s, reprezentowanych przez l
, w1
, w2
i b1
za pośrednictwem b8
w opisie składni. Kreator aplikacji i kreatory kodu tworzą unikatowe identyfikatory klas OLE zgodnie z potrzebami.
Wymagania
Nagłówek: afxdisp.h
IMPLEMENT_OLECTLTYPE
Implementuje GetUserTypeNameID
funkcje składowe i GetMiscStatus
klasy sterującej.
Składnia
DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )
Parametry
class_name
Nazwa klasy sterującej.
idsUserTypeName
Identyfikator zasobu ciągu zawierającego zewnętrzną nazwę kontrolki.
dwOleMisc
Wyliczenie zawierające co najmniej jedną flagę. Aby uzyskać więcej informacji na temat tego wyliczenia, zobacz OLEMISC
w zestawie Windows SDK.
Uwagi
Oprócz IMPLEMENT_OLECTLTYPE
polecenia należy dodać DECLARE_OLECTLTYPE
makro do deklaracji klasy sterującej.
Funkcja GetUserTypeNameID
składowa zwraca ciąg zasobu, który identyfikuje klasę sterowania. GetMiscStatus
OLEMISC
zwraca bity dla kontrolki. Wyliczenie określa kolekcję ustawień opisujących różne cechy kontrolki. Pełny opis ustawień można OLEMISC
znaleźć OLEMISC
w zestawie Windows SDK.
Uwaga
Domyślne ustawienia używane przez kontrolkę ActiveXWizard to: OLEMISC_ACTIVATEWHENVISIBLE
, , OLEMISC_SETCLIENTSITEFIRST
OLEMISC_INSIDEOUT
, OLEMISC_CANTLINKINSIDE
, i OLEMISC_RECOMPOSEONRESIZE
.
Wymagania
Nagłówek: afxctl.h
IMPLEMENT_SERIAL
Generuje kod C++ niezbędny dla dynamicznej CObject
klasy pochodnej z dostępem w czasie wykonywania do nazwy klasy i pozycji w hierarchii.
IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)
Parametry
class_name
Rzeczywista nazwa klasy.
base_class_name
Nazwa klasy bazowej.
wSchema
UINT "numer wersji", który zostanie zakodowany w archiwum, aby umożliwić program deserializacji identyfikacji i obsługi danych utworzonych przez wcześniejsze wersje programu. Numer schematu klasy nie może mieć wartości -1.
Uwagi
Użyj makra IMPLEMENT_SERIAL
w .cpp
module, a następnie połącz wynikowy kod obiektu tylko raz.
Makro służy AFX_API
do automatycznego eksportowania CArchive
operatora wyodrębniania dla klas używających DECLARE_SERIAL
makr i IMPLEMENT_SERIAL
. Nawias deklaracji klas (znajdujących się w .h
pliku) z następującym kodem:
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
// <your class declarations here>
#undef AFX_API
#define AFX_API
Aby uzyskać więcej informacji, zobacz CObject
Tematy klas.
Przykład
IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)
Wymagania
Nagłówek: afx.h
RUNTIME_CLASS
Pobiera strukturę klasy czasu wykonywania z nazwy klasy C++.
RUNTIME_CLASS(class_name)
Parametry
class_name
Rzeczywista nazwa klasy (nie ujęta w cudzysłów).
Uwagi
RUNTIME_CLASS
Zwraca wskaźnik do CRuntimeClass
struktury dla klasy określonej przez class_name
. Tylko CObject
klasy pochodne zadeklarowane za pomocą DECLARE_DYNAMIC
metody , DECLARE_DYNCREATE
lub DECLARE_SERIAL
będą zwracać wskaźniki do CRuntimeClass
struktury.
Aby uzyskać więcej informacji, zobacz CObject
Tematy dotyczące klas.
Przykład
CRuntimeClass* prt = RUNTIME_CLASS(CAge);
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
Wymagania
Nagłówek: afx.h
DECLARE_OLECREATE
Umożliwia tworzenie obiektów klas pochodnych CCmdTarget
za pomocą automatyzacji OLE.
DECLARE_OLECREATE(class_name)
Parametry
class_name
Rzeczywista nazwa klasy.
Uwagi
To makro umożliwia innym aplikacjom obsługującym ole tworzenie obiektów tego typu.
DECLARE_OLECREATE
Dodaj makro w .h
module dla klasy, a następnie dołącz ten moduł we wszystkich .cpp
modułach, które wymagają dostępu do obiektów tej klasy.
Jeśli DECLARE_OLECREATE
element jest uwzględniony w deklaracji klasy, IMPLEMENT_OLECREATE
należy uwzględnić w implementacji klasy. Deklaracja klasy używająca DECLARE_OLECREATE
polecenia musi być również używana DECLARE_DYNCREATE
lub DECLARE_SERIAL
.
Wymagania
Nagłówek: afxdisp.h
IMPLEMENT_OLECREATE
To makro lub IMPLEMENT_OLECREATE_FLAGS
musi zostać wyświetlone w pliku implementacji dla dowolnej klasy, która używa klasy DECLARE_OLECREATE
.
IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Parametry
class_name
Rzeczywista nazwa klasy.
external_name
Nazwa obiektu uwidoczniona innym aplikacjom (ujęta w cudzysłów).
l
, w1
, w2
b4
b1
b3
b8
b2
b5
b6
b7
składniki klasy CLSID.
Uwagi
Uwaga
Jeśli używasz usługi IMPLEMENT_OLECREATE
, domyślnie obsługujesz tylko pojedynczy model wątków. Jeśli używasz metody IMPLEMENT_OLECREATE_FLAGS
, możesz określić, który model wątków obsługuje obiekt przy użyciu parametru nFlags
.
Nazwa zewnętrzna to identyfikator udostępniany innym aplikacjom. Aplikacje klienckie używają nazwy zewnętrznej do żądania obiektu tej klasy z serwera automatyzacji.
Identyfikator klasy OLE jest unikatowym 128-bitowym identyfikatorem obiektu. Składa się z jednego long
, dwóch **WORD
s i ośmiu **BYTE
s, reprezentowanych przez l
, w1
, w2
i b1
za pośrednictwem b8
w opisie składni. Kreator aplikacji i kreatory kodu tworzą unikatowe identyfikatory klas OLE zgodnie z potrzebami.
Wymagania
Nagłówek: afxdisp.h
Zobacz też
Makra i globalne
Izolacja biblioteki formantów wspólnych MFC
Klucz CLSID