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 COleMessageFilter
obiektu 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ą AfxOleLockControl
polecenia 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.
IDispatch
OAT_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ą AfxOleLockControl
elementu , 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