Řízení aplikace
OLE vyžaduje značnou kontrolu nad aplikacemi a jejich objekty. Knihovny DLL systému OLE musí být schopné spouštět a vydávat aplikace automaticky, koordinovat jejich produkci a úpravy objektů atd. Funkce v tomto tématu splňují tyto požadavky. Kromě volané knihovny DLL systému OLE je nutné tyto funkce někdy volat také aplikacemi.
Řízení aplikace
Název | Popis |
---|---|
AfxOleCanExitApp | Určuje, jestli se aplikace může ukončit. |
AfxOleGetMessageFilter | Načte aktuální filtr zpráv aplikace. |
AfxOleGetUserCtrl | Načte aktuální příznak uživatelského ovládacího prvku. |
AfxOleSetUserCtrl | Nastaví nebo vymaže příznak uživatelského ovládacího prvku. |
AfxOleLockApp | Zvýší globální počet aktivních objektů v aplikaci. |
AfxOleLockControl | Uzamkne objekt pro vytváření tříd zadaného ovládacího prvku. |
AfxOleUnlockApp | Sníží počet aktivních objektů v aplikaci. |
AfxOleUnlockControl | Odemkne objekt pro vytváření tříd zadaného ovládacího prvku. |
AfxOleRegisterServerClass | Zaregistruje server v systémovém registru OLE. |
AfxOleSetEditMenu | Implementuje uživatelské rozhraní pro příkaz typename Object. |
AfxOleCanExitApp
Určuje, jestli se aplikace může ukončit.
BOOL AFXAPI AfxOleCanExitApp();
Návratová hodnota
Nenulové, pokud aplikace může ukončit; jinak 0.
Poznámky
Aplikace by se neměla ukončit, pokud nejsou k dispozici žádné odkazy na jeho objekty. Globální funkce AfxOleLockApp
a AfxOleUnlockApp
přírůstky a dekrementace, v uvedeném pořadí, čítač odkazů na objekty aplikace. Aplikace by neměla ukončit, pokud je tento čítač nenulový. Pokud je čítač nenulový, hlavní okno aplikace je skryté (nezničeno), když uživatel zvolí možnost Zavřít z systémové nabídky nebo Ukončit z nabídky Soubor. Architektura volá tuto funkci v CFrameWnd::OnClose
.
Příklad
// 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;
}
}
Požadavky
Hlavička: afxdisp.h
AfxOleGetMessageFilter
Načte aktuální filtr zpráv aplikace.
COleMessageFilter* AFXAPI AfxOleGetMessageFilter();
Návratová hodnota
Ukazatel na aktuální filtr zpráv.
Poznámky
Voláním této funkce získáte přístup k aktuálnímu COleMessageFilter
objektu -odvozeného objektu stejně, jako byste volali AfxGetApp
přístup k aktuálnímu objektu aplikace.
Příklad
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();
}
//...
//...
//...
}
Požadavky
Hlavička: afxwin.h
AfxOleGetUserCtrl
Načte aktuální příznak uživatelského ovládacího prvku.
BOOL AFXAPI AfxOleGetUserCtrl();
Návratová hodnota
Nenulové, pokud má uživatel kontrolu nad aplikací; jinak 0.
Poznámky
Uživatel má kontrolu nad aplikací, když uživatel explicitně otevřel nebo vytvořil nový dokument. Uživatel má také kontrolu nad tím, jestli aplikace nebyla spuštěna sadami DLL systému OLE – jinými slovy, pokud uživatel spustil aplikaci se systémovým prostředím.
Požadavky
Hlavička: afxdisp.h
AfxOleSetUserCtrl
Nastaví nebo vymaže příznak uživatelského ovládacího prvku, který je vysvětlen v odkazu pro AfxOleGetUserCtrl
.
void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);
Parametry
bUserCtrl
Určuje, zda má být příznak uživatelského ovládacího prvku nastaven nebo vymazán.
Poznámky
Architektura volá tuto funkci, když uživatel vytvoří nebo načte dokument, ale ne při načtení nebo vytvoření dokumentu prostřednictvím nepřímé akce, jako je načtení vloženého objektu z aplikace kontejneru.
Tuto funkci zavolejte, pokud by ostatní akce ve vaší aplikaci měly dát uživateli kontrolu nad aplikací.
Požadavky
Hlavička: afxdisp.h
AfxOleLockApp
Zvýší globální počet aktivních objektů v aplikaci.
void AFXAPI AfxOleLockApp();
Poznámky
Architektura uchovává počet aktivních objektů v aplikaci. Funkce AfxOleLockApp
a AfxOleUnlockApp
inkrementace a snížení tohoto počtu.
Když se uživatel pokusí zavřít aplikaci, která obsahuje aktivní objekty – aplikaci, pro kterou je počet aktivních objektů nenulový – architektura skryje aplikaci ze zobrazení uživatele místo jeho úplné vypnutí. Funkce AfxOleCanExitApp
určuje, jestli může aplikace ukončit.
Volání AfxOleLockApp
z libovolného objektu, který zpřístupňuje rozhraní OLE, pokud by bylo nežádoucí, aby byl tento objekt zničen, zatímco je stále používán klientskou aplikací. AfxOleUnlockApp
Volání v destruktoru libovolného objektu, který volá AfxOleLockApp
v konstruktoru. Ve výchozím nastavení COleDocument
(a odvozené třídy) automaticky uzamknout a odemknout aplikaci.
Příklad
// 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();
}
Požadavky
Hlavička: afxdisp.h
AfxOleUnlockApp
Sníží počet aktivních objektů v aplikaci.
void AFXAPI AfxOleUnlockApp();
Poznámky
Další informace najdete AfxOleLockApp
v tématu.
Když počet aktivních objektů dosáhne nuly, AfxOleOnReleaseAllObjects
je volána.
Příklad
Podívejte se na příklad pro AfxOleLockApp.
Požadavky
Hlavička: afxdisp.h
AfxOleLockControl
Uzamkne objekt pro vytváření tříd zadaného ovládacího prvku tak, aby dynamicky vytvořená data přidružená k ovládacího prvku zůstala v paměti.
Syntaxe
BOOL AFXAPI AfxOleLockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );
Parametry
clsid
Jedinečné ID třídy ovládacího prvku.
lpszProgID
Jedinečné ID programu ovládacího prvku.
Návratová hodnota
Nenulové, pokud byla továrna třídy ovládacího prvku úspěšně uzamčena; jinak 0.
Poznámky
To může výrazně urychlit zobrazení ovládacích prvků. Když například vytvoříte ovládací prvek v dialogovém okně a uzamknete ovládací prvek s AfxOleLockControl
, nemusíte ho vytvářet a zabíjet znovu při každém zobrazení nebo zničení dialogového okna. Pokud se uživatel otevře a zavře dialogové okno opakovaně, může uzamčení ovládacích prvků výrazně zvýšit výkon. Až budete připraveni zničit ovládací prvek, zavolejte AfxOleUnlockControl
.
Příklad
// 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"));
Požadavky
Hlavička: afxwin.h
AfxOleRegisterServerClass
Tato funkce umožňuje zaregistrovat server v systémovém registru 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
Odkaz na ID třídy OLE serveru.
lpszClassName
Ukazatel na řetězec obsahující název třídy objektů serveru.
lpszShortTypeName
Ukazatel na řetězec obsahující krátký název typu objektu serveru, například "Graf".
lpszLongTypeName
Ukazatel na řetězec obsahující dlouhý název typu objektu serveru, například "Microsoft Excel 5.0 Chart".
nAppType
Hodnota převzatá z OLE_APPTYPE výčtu určující typ aplikace OLE. Možné hodnoty jsou následující:
OAT_INPLACE_SERVER Server má úplné uživatelské rozhraní serveru.
OAT_SERVER Server podporuje pouze vkládání.
OAT_CONTAINER Kontejner podporuje odkazy na vkládání.
IDispatch
OAT_DISPATCH_OBJECT objekt podporující.
rglpszRegister
Pole ukazatelů na řetězce představující klíče a hodnoty, které mají být přidány do systémového registru OLE, pokud nejsou nalezeny žádné existující hodnoty pro klíče.
rglpszOverwrite
Pole ukazatelů na řetězce představující klíče a hodnoty, které se mají přidat do systémového registru OLE, pokud registr obsahuje existující hodnoty pro dané klíče.
Návratová hodnota
Nenulové, pokud je třída serveru úspěšně zaregistrována; jinak 0.
Poznámky
Většina aplikací může použít COleTemplateServer::Register
k registraci typů dokumentů aplikace. Pokud formát systémového registru vaší aplikace neodpovídá typickému vzoru, můžete ho použít AfxOleRegisterServerClass
pro větší kontrolu.
Registr se skládá ze sady klíčů a hodnot. Argumenty rglpszRegister a rglpszOverwrite jsou pole ukazatelů na řetězce, z nichž každá se skládá z klíče a hodnoty oddělené znakem NULL ( '\0'
). Každý z těchto řetězců může mít nahraditelné parametry, jejichž místa jsou označena sekvencemi znaků %1 až %5.
Symboly jsou vyplněny následujícím způsobem:
Symbol | Hodnota |
---|---|
1 % | ID třídy formátované jako řetězec |
2 % | Název třídy |
3 % | Cesta ke spustitelnému souboru |
4 % | Krátký název typu |
5 % | Dlouhý název typu |
Požadavky
Hlavička: afxdisp.h
AfxOleSetEditMenu
Implementuje uživatelské rozhraní pro příkaz typename Object.
void AFXAPI AfxOleSetEditMenu(
COleClientItem* pClient,
CMenu* pMenu,
UINT iMenuItem,
UINT nIDVerbMin,
UINT nIDVerbMax = 0,
UINT nIDConvert = 0);
Parametry
pClient
Ukazatel na položku OLE klienta.
pMenu
Ukazatel na objekt nabídky, který se má aktualizovat.
iMenuItem
Index položky nabídky, kterou chcete aktualizovat.
nIDVerbMin
ID příkazu, které odpovídá primárnímu slovesu.
nIDVerbMax
ID příkazu, které odpovídá poslednímu slovesu.
nIDConvert
ID položky nabídky Převést
Poznámky
Pokud server rozpozná pouze primární příkaz, položka nabídky se změní na příkaz " příkaz typename Object" a příkaz nIDVerbMin se odešle, když uživatel vybere příkaz. Pokud server rozpozná několik sloves, položka nabídky se změní na typename Object a podnabídka se zobrazí se všemi příkazy, když uživatel vybere příkaz. Když uživatel zvolí sloveso z podnabídky, odešle se nIDVerbMin , pokud je zvolen první sloveso, nIDVerbMin + 1 se odešle, pokud je zvolen druhý příkaz, a tak dále. Výchozí COleDocument
implementace tuto funkci automaticky zpracuje.
Ve skriptu prostředku aplikace klienta () musíte mít následující příkaz. RC) soubor:
<#include afxolecl.rc>
Požadavky
Hlavička: afxole.h
AfxOleUnlockControl
Odemkne objekt pro vytváření tříd zadaného ovládacího prvku.
Syntaxe
BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );
Parametry
clsid
Jedinečné ID třídy ovládacího prvku.
lpszProgID
Jedinečné ID programu ovládacího prvku.
Návratová hodnota
Nenulové, pokud byla továrna třídy ovládacího prvku úspěšně odemknuta; jinak 0.
Poznámky
Ovládací prvek je uzamčen pomocí AfxOleLockControl
, takže dynamicky vytvořená data přidružená k ovládacího prvku zůstanou v paměti. To může výrazně urychlit zobrazení ovládacího prvku, protože ovládací prvek nemusí být vytvořen a zničen při každém zobrazení. Až budete připraveni zničit ovládací prvek, zavolejte AfxOleUnlockControl
.
Příklad
// Unlock control's (Microsoft Calendar Control) class factory.
AfxOleUnlockControl(_T("MSCAL.Calendar"));
Požadavky
Hlavička: afxwin.h