Dela via


Programkontroll

OLE kräver omfattande kontroll över program och deras objekt. OLE-system-DLL:er måste kunna starta och släppa program automatiskt, samordna deras produktion och ändring av objekt och så vidare. Funktionerna i det här avsnittet uppfyller dessa krav. Förutom att anropas av OLE-system-DLL:er måste dessa funktioner ibland även anropas av program.

Programkontroll

Namn Beskrivning
AfxOleCanExitApp Anger om programmet kan avslutas.
AfxOleGetMessageFilter Hämtar programmets aktuella meddelandefilter.
AfxOleGetUserCtrl Hämtar den aktuella användarkontrollflaggan.
AfxOleSetUserCtrl Anger eller avmarkerar användarkontrollflaggan.
AfxOleLockApp Ökar ramverkets globala antal aktiva objekt i ett program.
AfxOleLockControl Låser klassfabriken för den angivna kontrollen.
AfxOleUnlockApp Minskar ramverkets antal aktiva objekt i ett program.
AfxOleUnlockControl Låser upp klassfabriken för den angivna kontrollen.
AfxOleRegisterServerClass Registrerar en server i OLE-systemregistret.
AfxOleSetEditMenu Implementerar användargränssnittet för kommandot typename Object.

AfxOleCanExitApp

Anger om programmet kan avslutas.

BOOL AFXAPI AfxOleCanExitApp();

Returvärde

Nonzero om programmet kan avslutas; annars 0.

Anmärkningar

Ett program bör inte avslutas om det finns utestående referenser till dess objekt. De globala funktionerna AfxOleLockApp samt AfxOleUnlockApp inkrement och minskning, respektive en räknare med referenser till programmets objekt. Programmet bör inte avslutas när den här räknaren inte är noll. Om räknaren inte är noll döljs programmets huvudfönster (förstörs inte) när användaren väljer Stäng från systemmenyn eller Avsluta från Arkiv-menyn. Ramverket anropar den här funktionen i CFrameWnd::OnClose.

Exempel

// 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;
   }
}

Kravspecifikation

Rubrik: afxdisp.h

AfxOleGetMessageFilter

Hämtar programmets aktuella meddelandefilter.

COleMessageFilter* AFXAPI AfxOleGetMessageFilter();

Returvärde

En pekare till det aktuella meddelandefiltret.

Anmärkningar

Anropa den här funktionen för att få åtkomst till det aktuella COleMessageFilter- härledda objektet, precis som du anropar AfxGetApp för att komma åt det aktuella programobjektet.

Exempel

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();
   }
   //...
   //...
   //...
}

Kravspecifikation

Rubrik: afxwin.h

AfxOleGetUserCtrl

Hämtar den aktuella användarkontrollflaggan.

BOOL AFXAPI AfxOleGetUserCtrl();

Returvärde

Nonzero om användaren har kontroll över programmet; annars 0.

Anmärkningar

Användaren har kontroll över programmet när användaren uttryckligen har öppnat eller skapat ett nytt dokument. Användaren har också kontroll över om programmet inte startades av OLE-systemets DLL:er, med andra ord om användaren startade programmet med systemgränssnittet.

Kravspecifikation

Rubrik: afxdisp.h

AfxOleSetUserCtrl

Anger eller rensar flaggan för användarkontroll, vilket förklaras i referensen för AfxOleGetUserCtrl.

void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);

Parameterar

bUserCtrl
Anger om användarkontrollflaggan ska anges eller rensas.

Anmärkningar

Ramverket anropar den här funktionen när användaren skapar eller läser in ett dokument, men inte när ett dokument läses in eller skapas via en indirekt åtgärd som att läsa in ett inbäddat objekt från ett containerprogram.

Anropa den här funktionen om andra åtgärder i programmet ska ge användaren kontroll över programmet.

Kravspecifikation

Rubrik: afxdisp.h

AfxOleLockApp

Ökar ramverkets globala antal aktiva objekt i programmet.

void AFXAPI AfxOleLockApp();

Anmärkningar

Ramverket behåller antalet objekt som är aktiva i ett program. Funktionerna AfxOleLockApp och AfxOleUnlockApp ökar respektive minskar det här antalet.

När användaren försöker stänga ett program som har aktiva objekt – ett program där antalet aktiva objekt inte är noll – döljer ramverket programmet från användarens vy i stället för att helt stänga av det. Funktionen AfxOleCanExitApp anger om programmet kan avslutas.

Anropa AfxOleLockApp från alla objekt som exponerar OLE-gränssnitt, om det skulle vara oönskat att objektet förstörs medan det fortfarande används av ett klientprogram. Anropa AfxOleUnlockApp även destructor för alla objekt som anropar AfxOleLockApp i konstruktorn. Som standard COleDocument låser (och härledda klasser) automatiskt programmet och låser upp det.

Exempel

// 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();
}

Kravspecifikation

Rubrik: afxdisp.h

AfxOleUnlockApp

Minskar ramverkets antal aktiva objekt i programmet.

void AFXAPI AfxOleUnlockApp();

Anmärkningar

Mer AfxOleLockApp information finns i.

När antalet aktiva objekt når noll AfxOleOnReleaseAllObjects anropas.

Exempel

Se exemplet för AfxOleLockApp.

Kravspecifikation

Rubrik: afxdisp.h

AfxOleLockControl

Låser klassfabriken för den angivna kontrollen så att dynamiskt skapade data som är associerade med kontrollen finns kvar i minnet.

Syntax

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

Parameterar

clsid
Kontrollens unika klass-ID.

lpszProgID
Kontrollens unika program-ID.

Returvärde

Nonzero om kontrollens klassfabrik har låsts. annars 0.

Anmärkningar

Detta kan avsevärt påskynda visningen av kontrollerna. När du till exempel skapar en kontroll i en dialogruta och låser kontrollen med AfxOleLockControlbehöver du inte skapa och döda den igen varje gång dialogrutan visas eller förstörs. Om användaren öppnar och stänger en dialogruta upprepade gånger kan låsning av kontrollerna avsevärt förbättra prestandan. När du är redo att förstöra kontrollen anropar du AfxOleUnlockControl.

Exempel

// 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"));

Kravspecifikation

rubrik: afxwin.h

AfxOleRegisterServerClass

Med den här funktionen kan du registrera servern i OLE-systemregistret.

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

Parameterar

clsid
Referens till serverns OLE-klass-ID.

lpszClassName
Pekare till en sträng som innehåller klassnamnet för serverns objekt.

lpszShortTypeName
Pekare till en sträng som innehåller det korta namnet på serverns objekttyp, till exempel "Diagram".

lpszLongTypeName
Pekare till en sträng som innehåller det långa namnet på serverns objekttyp, till exempel "Microsoft Excel 5.0-diagram".

nAppType
Ett värde som hämtats från OLE_APPTYPE uppräkning och som anger typen av OLE-program. Möjliga värden är följande:

  • OAT_INPLACE_SERVER Server har fullständigt användargränssnitt för servern.

  • OAT_SERVER Server stöder endast inbäddning.

  • OAT_CONTAINER Container stöder länkar till inbäddningar.

  • IDispatchOAT_DISPATCH_OBJECT -kompatibelt objekt.

rglpszRegister
Matris med pekare till strängar som representerar de nycklar och värden som ska läggas till i OLE-systemregistret om inga befintliga värden för nycklarna hittas.

rglpszOverwrite
Matris med pekare till strängar som representerar de nycklar och värden som ska läggas till i OLE-systemregistret om registret innehåller befintliga värden för de angivna nycklarna.

Returvärde

Nonzero om serverklassen har registrerats. annars 0.

Anmärkningar

De flesta program kan använda COleTemplateServer::Register för att registrera programmets dokumenttyper. Om programmets systemregisterformat inte passar det vanliga mönstret kan du använda AfxOleRegisterServerClass för mer kontroll.

Registret består av en uppsättning nycklar och värden. Argumenten rglpszRegister och rglpszOverwrite är matriser med pekare till strängar, var och en består av en nyckel och ett värde som avgränsas med ett NULL-tecken ('\0'). Var och en av dessa strängar kan ha utbytbara parametrar vars platser markeras av teckensekvenserna %1 via %5.

Symbolerna fylls i på följande sätt:

Symbol Värde
%1 Klass-ID, formaterat som en sträng
%2 Klassnamn
%3 Sökväg till körbar fil
%4 Kort typnamn
%5 Namn på lång typ

Kravspecifikation

Rubrik: afxdisp.h

AfxOleSetEditMenu

Implementerar användargränssnittet för kommandot typename Object.

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

Parameterar

pClient
En pekare till klientens OLE-objekt.

pMenu
En pekare till menyobjektet som ska uppdateras.

iMenuItem
Indexet för menyalternativet som ska uppdateras.

nIDVerbMin
Kommando-ID:t som motsvarar det primära verbet.

nIDVerbMax
Kommando-ID:t som motsvarar det sista verbet.

nIDConvert
ID för menyalternativet Konvertera.

Anmärkningar

Om servern bara känner igen ett primärt verb blir menyalternativet " verbtypnamnobjekt " och kommandot nIDVerbMin skickas när användaren väljer kommandot. Om servern känner igen flera verb blir menyalternativet " typename Object" och en undermeny som visar alla verb visas när användaren väljer kommandot. När användaren väljer ett verb från undermenyn skickas nIDVerbMin om det första verbet väljs, nIDVerbMin + 1 skickas om det andra verbet väljs och så vidare. Standardimplementeringen COleDocument hanterar automatiskt den här funktionen.

Du måste ha följande instruktion i klientens programresursskript (. RC-fil:

<#include afxolecl.rc>

Kravspecifikation

Rubrik: afxole.h

AfxOleUnlockControl

Låser upp klassfabriken för den angivna kontrollen.

Syntax

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

Parameterar

clsid
Kontrollens unika klass-ID.

lpszProgID
Kontrollens unika program-ID.

Returvärde

Nonzero om kontrollens klassfabrik har låsts upp. annars 0.

Anmärkningar

En kontroll är låst med AfxOleLockControl, så att dynamiskt skapade data som är associerade med kontrollen förblir i minnet. Detta kan avsevärt påskynda visningen av kontrollen eftersom kontrollen inte behöver skapas och förstöras varje gång den visas. När du är redo att förstöra kontrollen anropar du AfxOleUnlockControl.

Exempel

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

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

Kravspecifikation

rubrik: afxwin.h

Se även

makron och globala