Anwendungssteuerelement

OLE erfordert eine erhebliche Kontrolle über Anwendungen und deren Objekte. Die OLE-System-DLLs müssen in der Lage sein, Anwendungen automatisch zu starten und freizugeben, ihre Produktion und Änderung von Objekten zu koordinieren usw. Die Funktionen in diesem Thema erfüllen diese Anforderungen. Neben dem Aufruf durch die OLE-System-DLLs müssen diese Funktionen manchmal auch von Anwendungen aufgerufen werden.

Anwendungssteuerelement

Name Beschreibung
AfxOleCanExitApp Gibt an, ob die Anwendung beendet werden kann.
AfxOleGetMessageFilter Ruft den aktuellen Nachrichtenfilter der Anwendung ab.
AfxOleGetUserCtrl Ruft das aktuelle Benutzersteuerelement-Flag ab.
AfxOleSetUserCtrl Legt die Kennzeichnung des Benutzersteuerelements fest oder löscht sie.
AfxOleLockApp Erhöht die globale Anzahl der aktiven Objekte in einer Anwendung.
AfxOleLockControl Sperrt die Klassenfactory des angegebenen Steuerelements.
AfxOleUnlockApp Erhöht die Anzahl der aktiven Objekte in einer Anwendung.
AfxOleUnlockControl Entsperrt die Klassenfactory des angegebenen Steuerelements.
AfxOleRegisterServerClass Registriert einen Server in der OLE-Systemregistrierung.
AfxOleSetEditMenu Implementiert die Benutzeroberfläche für den Befehl "Objekttyp ".

AfxOleCanExitApp

Gibt an, ob die Anwendung beendet werden kann.

BOOL AFXAPI AfxOleCanExitApp();

Rückgabewert

Nonzero, wenn die Anwendung beendet werden kann; andernfalls 0.

Hinweise

Eine Anwendung sollte nicht beendet werden, wenn es ausstehende Verweise auf seine Objekte gibt. Die globalen Funktionen AfxOleLockApp bzw AfxOleUnlockApp . die Inkrementierung bzw. Dekrementierung eines Zählers von Verweisen auf die Objekte der Anwendung. Die Anwendung sollte nicht beendet werden, wenn dieser Zähler ungleich Null ist. Wenn der Zähler nicht null ist, wird das Standard Fenster der Anwendung ausgeblendet (nicht zerstört), wenn der Benutzer im Systemmenü "Schließen" auswählt oder aus dem Menü "Datei beenden" auswählt. Das Framework ruft diese Funktion in CFrameWnd::OnClose.

Beispiel

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

Anforderungen

Header: afxdisp.h

AfxOleGetMessageFilter

Ruft den aktuellen Nachrichtenfilter der Anwendung ab.

COleMessageFilter* AFXAPI AfxOleGetMessageFilter();

Rückgabewert

Ein Zeiger auf den aktuellen Nachrichtenfilter.

Hinweise

Rufen Sie diese Funktion auf, um auf das aktuelle COleMessageFilterabgeleitete Objekt zuzugreifen, genauso wie Sie den Zugriff auf das aktuelle Anwendungsobjekt aufrufen AfxGetApp würden.

Beispiel

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

Anforderungen

Header: afxwin.h

AfxOleGetUserCtrl

Ruft das aktuelle Benutzersteuerelement-Flag ab.

BOOL AFXAPI AfxOleGetUserCtrl();

Rückgabewert

Nonzero, wenn der Benutzer die Kontrolle über die Anwendung hat; andernfalls 0.

Hinweise

Der Benutzer hat die Kontrolle über die Anwendung, wenn der Benutzer ein neues Dokument explizit geöffnet oder erstellt hat. Der Benutzer ist auch in der Kontrolle, wenn die Anwendung nicht von den OLE-System-DLLs gestartet wurde, d. h., wenn der Benutzer die Anwendung mit der Systemshell gestartet hat.

Anforderungen

Header: afxdisp.h

AfxOleSetUserCtrl

Legt das Flag des Benutzersteuerelements fest oder löscht sie, das in der Referenz für AfxOleGetUserCtrl.

void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);

Parameter

bUserCtrl
Gibt an, ob das Benutzersteuerelement-Flag festgelegt oder gelöscht werden soll.

Hinweise

Das Framework ruft diese Funktion auf, wenn der Benutzer ein Dokument erstellt oder lädt, aber nicht, wenn ein Dokument über eine indirekte Aktion geladen oder erstellt wird, z. B. das Laden eines eingebetteten Objekts aus einer Containeranwendung.

Rufen Sie diese Funktion auf, wenn andere Aktionen in Ihrer Anwendung dem Benutzer die Kontrolle über die Anwendung geben sollen.

Anforderungen

Header: afxdisp.h

AfxOleLockApp

Erhöht die globale Anzahl der aktiven Objekte in der Anwendung.

void AFXAPI AfxOleLockApp();

Hinweise

Das Framework speichert die Anzahl der objekte, die in einer Anwendung aktiv sind. Diese AfxOleLockApp Anzahl erhöht bzw AfxOleUnlockApp . erhöht diese Anzahl.

Wenn der Benutzer versucht, eine Anwendung zu schließen, die aktive Objekte enthält – eine Anwendung, für die die Anzahl der aktiven Objekte nicht null ist – blendet das Framework die Anwendung aus der Ansicht des Benutzers aus, anstatt sie vollständig herunterzufahren. Die AfxOleCanExitApp Funktion gibt an, ob die Anwendung beendet werden kann.

Rufen Sie AfxOleLockApp von jedem Objekt auf, das OLE-Schnittstellen verfügbar macht, wenn es für dieses Objekt nicht wünschenswert wäre, während es von einer Clientanwendung verwendet wird. Rufen Sie AfxOleUnlockApp auch den Destruktor eines Objekts auf, das im Konstruktor aufruft AfxOleLockApp . Standardmäßig COleDocument (und abgeleitete Klassen) wird die Anwendung automatisch gesperrt und entsperrt.

Beispiel

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

Anforderungen

Header: afxdisp.h

AfxOleUnlockApp

Erhöht die Anzahl der aktiven Objekte in der Anwendung.

void AFXAPI AfxOleUnlockApp();

Hinweise

Weitere Informationen finden Sie AfxOleLockApp unter.

Wenn die Anzahl der aktiven Objekte null erreicht, AfxOleOnReleaseAllObjects wird sie aufgerufen.

Beispiel

Sehen Sie sich das Beispiel für AfxOleLockApp an.

Anforderungen

Header: afxdisp.h

AfxOleLockControl

Sperrt die Klassenfactory des angegebenen Steuerelements, sodass dynamisch erstellte Daten, die dem Steuerelement zugeordnet sind, wieder Standard im Arbeitsspeicher erstellt werden.

Syntax

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

Parameter

Clsid
Die eindeutige Klassen-ID des Steuerelements.

lpszProgID
Die eindeutige Programm-ID des Steuerelements.

Rückgabewert

Nonzero, wenn die Klassenfabrik des Steuerelements erfolgreich gesperrt wurde; andernfalls 0.

Hinweise

Dies kann die Anzeige der Steuerelemente erheblich beschleunigen. Wenn Sie beispielsweise ein Steuerelement in einem Dialogfeld erstellen und das Steuerelement mit AfxOleLockControlsperren, müssen Sie es nicht jedes Mal erstellen und töten, wenn das Dialogfeld angezeigt oder zerstört wird. Wenn der Benutzer ein Dialogfeld wiederholt öffnet und schließt, kann das Sperren der Steuerelemente die Leistung erheblich verbessern. Wenn Sie bereit sind, das Steuerelement zu zerstören, rufen Sie AfxOleUnlockControlauf.

Beispiel

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

Anforderungen

Header: afxwin.h

AfxOleRegisterServerClass

Mit dieser Funktion können Sie Ihren Server in der OLE-Systemregistrierung registrieren.

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

Parameter

Clsid
Verweis auf die OLE-Klassen-ID des Servers.

lpszClassName
Zeigen Sie auf eine Zeichenfolge, die den Klassennamen der Objekte des Servers enthält.

lpszShortTypeName
Zeigen Sie auf eine Zeichenfolge, die den kurzen Namen des Objekttyps des Servers enthält, z. B. "Diagramm".

lpszLongTypeName
Zeigen Sie auf eine Zeichenfolge, die den langen Namen des Objekttyps des Servers enthält, z. B. "Microsoft Excel 5.0-Diagramm".

nAppType
Ein Wert aus der OLE_APPTYPE-Aufzählung, der den Typ der OLE-Anwendung angibt. Mögliche Werte sind:

  • OAT_INPLACE_SERVER Server verfügt über eine vollständige Serverbenutzeroberfläche.

  • OAT_SERVER Server unterstützt nur das Einbetten.

  • OAT_CONTAINER Container unterstützt Links zu Einbettungen.

  • IDispatchOAT_DISPATCH_OBJECT -fähiges Objekt.

rglpszRegister
Array von Zeigern auf Zeichenfolgen, die die Schlüssel und Werte darstellen, die der OLE-Systemregistrierung hinzugefügt werden sollen, wenn keine vorhandenen Werte für die Schlüssel gefunden werden.

rglpszOverwrite
Array von Zeigern auf Zeichenfolgen, die die Schlüssel und Werte darstellen, die der OLE-Systemregistrierung hinzugefügt werden sollen, wenn die Registrierung vorhandene Werte für die angegebenen Schlüssel enthält.

Rückgabewert

Nonzero, wenn die Serverklasse erfolgreich registriert wurde; andernfalls 0.

Hinweise

Die meisten Anwendungen können zum Registrieren der Dokumenttypen der Anwendung verwendet werden COleTemplateServer::Register . Wenn das Systemregistrierungsformat Ihrer Anwendung nicht dem typischen Muster entspricht, können Sie dies für mehr Kontrolle verwenden AfxOleRegisterServerClass .

Die Registrierung besteht aus einer Reihe von Schlüsseln und Werten. Die Argumente rglpszRegister und rglpszOverwrite sind Arrays von Zeigern auf Zeichenfolgen, die jeweils aus einem Schlüssel und einem Wert bestehen, der durch ein NULL-Zeichen ( ) '\0'getrennt ist. Jede dieser Zeichenfolgen kann austauschbare Parameter aufweisen, deren Stellen durch die Zeichenfolgen %1 bis %5 gekennzeichnet sind.

Die Symbole werden wie folgt ausgefüllt:

Symbol Wert
1% Klassen-ID, formatiert als Zeichenfolge
%2 Klassenname
%3 Pfad zur ausführbaren Datei
4 % Kurzer Typname
5 % Name des langen Typs

Anforderungen

Header: afxdisp.h

AfxOleSetEditMenu

Implementiert die Benutzeroberfläche für den Befehl "Objekttyp ".

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

Parameter

pClient
Ein Zeiger auf das OLE-Clientelement.

pMenu
Ein Zeiger auf das Menüobjekt, das aktualisiert werden soll.

iMenuItem
Der Index des zu aktualisierenden Menüelements.

nIDVerbMin
Die Befehls-ID, die dem primären Verb entspricht.

nIDVerbMax
Die Befehls-ID, die dem letzten Verb entspricht.

nIDConvert
ID für das Menüelement "Konvertieren".

Hinweise

Wenn der Server nur ein primäres Verb erkennt, wird das Menüelement "verb typename Object" und der Befehl "nIDVerbMin " gesendet, wenn der Benutzer den Befehl auswählt. Wenn der Server mehrere Verben erkennt, wird das Menüelement " Typename Object" und ein Untermenü mit allen Verben angezeigt, wenn der Benutzer den Befehl auswählt. Wenn der Benutzer ein Verb aus dem Untermenü auswählt, wird nIDVerbMin gesendet, wenn das erste Verb ausgewählt wird, wird nIDVerbMin + 1 gesendet, wenn das zweite Verb ausgewählt wird usw. Die Standardimplementierung COleDocument behandelt dieses Feature automatisch.

Sie müssen die folgende Anweisung im Anwendungsressourcenskript Ihres Clients haben (. RC) Datei:

<#include afxolecl.rc>

Anforderungen

Kopfzeile: afxole.h

AfxOleUnlockControl

Entsperrt die Klassenfactory des angegebenen Steuerelements.

Syntax

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

Parameter

Clsid
Die eindeutige Klassen-ID des Steuerelements.

lpszProgID
Die eindeutige Programm-ID des Steuerelements.

Rückgabewert

Nonzero, wenn die Klassenfactory des Steuerelements erfolgreich entsperrt wurde; andernfalls 0.

Hinweise

Ein Steuerelement ist gesperrt, AfxOleLockControlsodass dynamisch erstellte Daten, die dem Steuerelement zugeordnet sind, wieder Standard im Arbeitsspeicher erstellt werden. Dies kann die Anzeige des Steuerelements erheblich beschleunigen, da das Steuerelement nicht erstellt und zerstört werden muss, wenn es angezeigt wird. Wenn Sie bereit sind, das Steuerelement zu zerstören, rufen Sie AfxOleUnlockControlauf.

Beispiel

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

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

Anforderungen

Header: afxwin.h

Siehe auch

Makros und Globalen