Udostępnij za pośrednictwem


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 CObjectklasy .

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 CObjectw 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_OLECTLTYPEpolecenia 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 CObjectklasy 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 CObjectw 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 na ThreadingModel=Apartmentwartość .
  • afxRegFreeThreading Ustawia model wątków w rejestrze na ThreadingModel=Freewartość .

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, w2b4b1b3b8 b2b5b6b7skł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 **WORDs i ośmiu **BYTEs, reprezentowanych przez l, w1, w2i 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_OLECTLTYPEpolecenia należy dodać DECLARE_OLECTLTYPE makro do deklaracji klasy sterującej.

Funkcja GetUserTypeNameID składowa zwraca ciąg zasobu, który identyfikuje klasę sterowania. GetMiscStatusOLEMISC 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_SETCLIENTSITEFIRSTOLEMISC_INSIDEOUT, OLEMISC_CANTLINKINSIDE, i OLEMISC_RECOMPOSEONRESIZE.

Wymagania

Nagłówek: afxctl.h

IMPLEMENT_SERIAL

Generuje kod C++ niezbędny dla dynamicznej CObjectklasy 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 CObjectklasy pochodne zadeklarowane za pomocą DECLARE_DYNAMICmetody , DECLARE_DYNCREATElub 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 CCmdTargetza 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, w2b4b1b3b8 b2b5b6b7skł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 **WORDs i ośmiu **BYTEs, reprezentowanych przez l, w1, w2i 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