Sdílet prostřednictvím


Ří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 COleMessageFilterobjektu -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í.

  • IDispatchOAT_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%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

Viz také

Makra a globální objekty