Udostępnij za pośrednictwem


Sterowanie aplikacjami

Ole wymaga znacznej kontroli nad aplikacjami i ich obiektami. Biblioteki DLL systemu OLE muszą mieć możliwość automatycznego uruchamiania i wydawania aplikacji, koordynowania ich produkcji i modyfikowania obiektów itd. Funkcje w tym temacie spełniają te wymagania. Oprócz wywoływanych przez biblioteki DLL systemu OLE, te funkcje muszą być czasami wywoływane przez aplikacje.

Sterowanie aplikacjami

Nazwa/nazwisko opis
AfxOleCanExitApp Wskazuje, czy aplikacja może zakończyć działanie.
AfxOleGetMessageFilter Pobiera bieżący filtr komunikatów aplikacji.
AfxOleGetUserCtrl Pobiera bieżącą flagę kontrolki użytkownika.
AfxOleSetUserCtrl Ustawia lub czyści flagę user-control.
AfxOleLockApp Zwiększa globalną liczbę aktywnych obiektów w aplikacji.
AfxOleLockControl Blokuje fabrykę klas określonej kontrolki.
AfxOleUnlockApp Dekrementuje liczbę aktywnych obiektów w aplikacji.
AfxOleUnlockControl Odblokuje fabrykę klas określonej kontrolki.
AfxOleRegisterServerClass Rejestruje serwer w rejestrze systemu OLE.
AfxOleSetEditMenu Implementuje interfejs użytkownika dla polecenia typename Object.

AfxOleCanExitApp

Wskazuje, czy aplikacja może zakończyć działanie.

BOOL AFXAPI AfxOleCanExitApp();

Wartość zwracana

Nonzero, jeśli aplikacja może zakończyć działanie; w przeciwnym razie 0.

Uwagi

Aplikacja nie powinna kończyć się, jeśli istnieją zaległe odwołania do jej obiektów. Funkcje globalne AfxOleLockApp oraz AfxOleUnlockApp przyrost i dekrementacja, odpowiednio, licznik odwołań do obiektów aplikacji. Aplikacja nie powinna kończyć się, gdy ten licznik nie jestzerowy. Jeśli licznik nie jestzerowy, główne okno aplikacji jest ukryte (nie niszczone), gdy użytkownik wybierze polecenie Zamknij z menu systemowego lub Zamknij z menu Plik. Struktura wywołuje tę funkcję w pliku CFrameWnd::OnClose.

Przykład

// Helper exit function for automation server
BOOL CMainFrame::CanExit()
{
   if (AfxOleCanExitApp())
   {
      // No outstanding object counts - go ahead and exit
      return TRUE;
   }
   else
   {
      // There are outstanding OLE object counts...
      // hide app to give user impression that application has exited.
      ShowWindow(SW_HIDE);
      // take user out of control of the app
      AfxOleSetUserCtrl(FALSE);
      return FALSE;
   }
}

Wymagania

Nagłówek: afxdisp.h

AfxOleGetMessageFilter

Pobiera bieżący filtr komunikatów aplikacji.

COleMessageFilter* AFXAPI AfxOleGetMessageFilter();

Wartość zwracana

Wskaźnik do bieżącego filtru komunikatu.

Uwagi

Wywołaj tę funkcję, aby uzyskać dostęp do bieżącego COleMessageFilterobiektu pochodnego, tak jak wywołasz AfxGetApp metodę w celu uzyskania dostępu do bieżącego obiektu aplikacji.

Przykład

COleMessageFilter *pFilter = AfxOleGetMessageFilter();
ASSERT_VALID(pFilter);
pFilter->BeginBusyState();
// do things requiring a busy state
pFilter->EndBusyState();

 

// Another example
//CWinApp-derived class
BOOL CCMFCAutomationApp::InitInstance()
{
   CWinApp::InitInstance();

   // Initialize OLE libraries
   if (!AfxOleInit())
   {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
   }

   CWinThread *pThread = AfxGetThread();
   if (pThread != NULL)
   {
      // Destroy message filter, thereby unregistering it.
      delete pThread->m_pMessageFilter;
      pThread->m_pMessageFilter = NULL;

      // Create the new message filter object.
      //CMyMessageFilter is derived from COleMessageFilter
      pThread->m_pMessageFilter = new CMyMessageFilter;
      ASSERT(AfxOleGetMessageFilter() != NULL);

      // Register the new message filter object.
      AfxOleGetMessageFilter()->Register();
   }
   //...
   //...
   //...
}

Wymagania

Nagłówek: afxwin.h

AfxOleGetUserCtrl

Pobiera bieżącą flagę kontrolki użytkownika.

BOOL AFXAPI AfxOleGetUserCtrl();

Wartość zwracana

Nonzero, jeśli użytkownik jest pod kontrolą aplikacji; w przeciwnym razie 0.

Uwagi

Użytkownik kontroluje aplikację, gdy użytkownik jawnie otworzył lub utworzył nowy dokument. Użytkownik jest również w kontrolce, jeśli aplikacja nie została uruchomiona przez biblioteki DLL systemu OLE — innymi słowy, jeśli użytkownik uruchomił aplikację za pomocą powłoki systemowej.

Wymagania

Nagłówek: afxdisp.h

AfxOleSetUserCtrl

Ustawia lub czyści flagę user-control, co zostało wyjaśnione w dokumentacji dla elementu AfxOleGetUserCtrl.

void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);

Parametry

bUserCtrl
Określa, czy flaga kontrolki użytkownika ma zostać ustawiona, czy wyczyszczone.

Uwagi

Struktura wywołuje tę funkcję, gdy użytkownik tworzy lub ładuje dokument, ale nie wtedy, gdy dokument jest ładowany lub tworzony za pośrednictwem akcji pośredniej, takiej jak ładowanie osadzonego obiektu z aplikacji kontenera.

Wywołaj tę funkcję, jeśli inne akcje w aplikacji powinny przejąć kontrolę nad aplikacją.

Wymagania

Nagłówek: afxdisp.h

AfxOleLockApp

Zwiększa globalną liczbę aktywnych obiektów w aplikacji.

void AFXAPI AfxOleLockApp();

Uwagi

Struktura przechowuje liczbę obiektów aktywnych w aplikacji. Funkcje AfxOleLockApp i AfxOleUnlockApp , odpowiednio, zwiększają i dekrementację tej liczby.

Gdy użytkownik próbuje zamknąć aplikację z aktywnymi obiektami — aplikacją, dla której liczba aktywnych obiektów jest niezerowa — struktura ukrywa aplikację przed widokiem użytkownika, a nie całkowicie ją zamyka. Funkcja AfxOleCanExitApp wskazuje, czy aplikacja może zakończyć działanie.

Wywołanie AfxOleLockApp z dowolnego obiektu, który uwidacznia interfejsy OLE, jeśli byłoby niepożądane, aby ten obiekt został zniszczony, nadal używany przez aplikację kliencką. Wywołaj AfxOleUnlockApp również w destruktorze dowolnego obiektu, który wywołuje AfxOleLockApp w konstruktorze. Domyślnie COleDocument (i klasy pochodne) automatycznie blokują i odblokowują aplikację.

Przykład

// Below is a code sample from an  Application Wizard-generated SDI
// Application with Automation support. The Application Wizard adds a
// dispatch interface to the document class. AfxOleLockApp() and
// AfxOleUnlockApp() respectively increment and decrement the
// application's object count. When the object count is equal to
// zero and if the user has not taken control of the application,
// the server is terminated.

CCMFCAutomationDoc::CCMFCAutomationDoc()
{
   EnableAutomation();
   AfxOleLockApp();
}

CCMFCAutomationDoc::~CCMFCAutomationDoc()
{
   AfxOleUnlockApp();
}

Wymagania

Nagłówek: afxdisp.h

AfxOleUnlockApp

Dekrementuje liczbę aktywnych obiektów platformy w aplikacji.

void AFXAPI AfxOleUnlockApp();

Uwagi

Aby uzyskać więcej informacji, zobacz AfxOleLockApp .

Gdy liczba aktywnych obiektów osiągnie zero, AfxOleOnReleaseAllObjects jest wywoływana.

Przykład

Zobacz przykład aplikacji AfxOleLockApp.

Wymagania

Nagłówek: afxdisp.h

AfxOleLockControl

Blokuje fabrykę klas określonej kontrolki tak, aby dynamicznie tworzone dane skojarzone z kontrolką pozostają w pamięci.

Składnia

BOOL AFXAPI AfxOleLockControl(  REFCLSID clsid  );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );

Parametry

Clsid
Unikatowy identyfikator klasy kontrolki.

lpszProgID
Unikatowy identyfikator programu kontrolki.

Wartość zwracana

Nonzero, jeśli fabryka klas kontrolki została pomyślnie zablokowana; w przeciwnym razie 0.

Uwagi

Może to znacznie przyspieszyć wyświetlanie kontrolek. Na przykład po utworzeniu kontrolki w oknie dialogowym i zablokowaniu kontrolki za pomocą AfxOleLockControlpolecenia nie trzeba tworzyć i zabijać go ponownie za każdym razem, gdy okno dialogowe zostanie wyświetlone lub zniszczone. Jeśli użytkownik otworzy i wielokrotnie zamyka okno dialogowe, blokowanie kontrolek może znacznie zwiększyć wydajność. Gdy wszystko będzie gotowe do zniszczenia kontrolki, wywołaj metodę AfxOleUnlockControl.

Przykład

// Starts and locks control's (Microsoft Calendar) class factory.
// Control will remain in memory for lifetime of
// application or until AfxOleUnlockControl() is called.

AfxOleLockControl(_T("MSCAL.Calendar"));

Wymagania

Nagłówek: afxwin.h

AfxOleRegisterServerClass

Ta funkcja umożliwia zarejestrowanie serwera w rejestrze systemu OLE.

BOOL AFXAPI AfxOleRegisterServerClass(
    REFCLSID clsid,
    LPCTSTR lpszClassName,
    LPCTSTR lpszShortTypeName,
    LPCTSTR lpszLongTypeName,
    OLE_APPTYPE nAppType = OAT_SERVER,
    LPCTSTR* rglpszRegister = NULL,
    LPCTSTR* rglpszOverwrite = NULL);

Parametry

Clsid
Odwołanie do identyfikatora klasy OLE serwera.

lpszClassName
Wskaźnik do ciągu zawierającego nazwę klasy obiektów serwera.

lpszShortTypeName
Wskaźnik do ciągu zawierającego krótką nazwę typu obiektu serwera, na przykład "Wykres".

lpszLongTypeName
Wskaźnik do ciągu zawierającego długą nazwę typu obiektu serwera, na przykład "Microsoft Excel 5.0 Chart".

nAppType
Wartość pobrana z wyliczenia OLE_APPTYPE określająca typ aplikacji OLE. Możliwe wartości są następujące:

  • OAT_INPLACE_SERVER Server ma pełny interfejs użytkownika serwera.

  • OAT_SERVER Server obsługuje tylko osadzanie.

  • OAT_CONTAINER Container obsługuje linki do osadzania.

  • IDispatchOAT_DISPATCH_OBJECT obiekt z obsługą.

rglpszRegister
Tablica wskaźników do ciągów reprezentujących klucze i wartości, które mają zostać dodane do rejestru systemu OLE, jeśli nie zostaną znalezione żadne istniejące wartości kluczy.

rglpszOverwrite
Tablica wskaźników do ciągów reprezentujących klucze i wartości, które mają zostać dodane do rejestru systemu OLE, jeśli rejestr zawiera istniejące wartości dla podanych kluczy.

Wartość zwracana

Nonzero, jeśli klasa serwera została pomyślnie zarejestrowana; w przeciwnym razie 0.

Uwagi

Większość aplikacji może używać COleTemplateServer::Register do rejestrowania typów dokumentów aplikacji. Jeśli format rejestru systemowego aplikacji nie pasuje do typowego wzorca, możesz użyć AfxOleRegisterServerClass go do większej kontroli.

Rejestr składa się z zestawu kluczy i wartości. Argumenty rglpszRegister i rglpszOverwrite to tablice wskaźników do ciągów, z których każdy składa się z klucza i wartości rozdzielone znakiem NULL ( '\0'). Każdy z tych ciągów może mieć parametry, których miejsca są oznaczone sekwencjami znaków od %1 do %5.

Symbole są wypełniane w następujący sposób:

Symbol Wartość
1% Identyfikator klasy sformatowany jako ciąg
2% Nazwa klasy
3% Ścieżka do pliku wykonywalnego
4% Krótka nazwa typu
5% Nazwa typu długiego

Wymagania

Nagłówek: afxdisp.h

AfxOleSetEditMenu

Implementuje interfejs użytkownika dla polecenia typename Object.

void AFXAPI AfxOleSetEditMenu(
    COleClientItem* pClient,
    CMenu* pMenu,
    UINT iMenuItem,
    UINT nIDVerbMin,
    UINT nIDVerbMax = 0,
    UINT nIDConvert = 0);

Parametry

pClient
Wskaźnik do elementu OLE klienta.

pMenu
Wskaźnik do obiektu menu, który ma zostać zaktualizowany.

Imenuitem
Indeks elementu menu, który ma zostać zaktualizowany.

nIDVerbMin
Identyfikator polecenia odpowiadający czasownikowi podstawowemu.

nIDVerbMax
Identyfikator polecenia odpowiadający ostatniemu czasownikowi.

nIDConvert
Identyfikator elementu menu Konwertuj.

Uwagi

Jeśli serwer rozpoznaje tylko czasownik podstawowy, element menu staje się "obiektem typu czasownika", a polecenie nIDVerbMin jest wysyłane, gdy użytkownik wybierze polecenie. Jeśli serwer rozpoznaje kilka czasowników, element menu stanie się " typename Object", a podmenu wyświetla wszystkie czasowniki, gdy użytkownik wybierze polecenie. Gdy użytkownik wybierze czasownik z podmenu, nIDVerbMin jest wysyłany, jeśli wybrano pierwsze zlecenie, nIDVerbMin + 1 jest wysyłany, jeśli wybrano drugie zlecenie itd. Domyślna COleDocument implementacja automatycznie obsługuje tę funkcję.

Musisz mieć następującą instrukcję w skryscie zasobu aplikacji klienta (. Plik RC):

<#include afxolecl.rc>

Wymagania

Nagłówek: afxole.h

AfxOleUnlockControl

Odblokuje fabrykę klas określonej kontrolki.

Składnia

BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );

Parametry

Clsid
Unikatowy identyfikator klasy kontrolki.

lpszProgID
Unikatowy identyfikator programu kontrolki.

Wartość zwracana

Nonzero, jeśli fabryka klas kontrolki została pomyślnie odblokowana; w przeciwnym razie 0.

Uwagi

Kontrolka jest zablokowana za pomocą AfxOleLockControlelementu , dzięki czemu dynamicznie tworzone dane skojarzone z kontrolką pozostają w pamięci. Może to znacznie przyspieszyć wyświetlanie kontrolki, ponieważ kontrolka nie musi być tworzona i niszczona za każdym razem, gdy jest wyświetlana. Gdy wszystko będzie gotowe do zniszczenia kontrolki, wywołaj metodę AfxOleUnlockControl.

Przykład

// Unlock control's (Microsoft Calendar Control) class factory.

AfxOleUnlockControl(_T("MSCAL.Calendar"));

Wymagania

Nagłówek: afxwin.h

Zobacz też

Makra i globalne