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.
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 ". |
Gibt an, ob die Anwendung beendet werden kann.
BOOL AFXAPI AfxOleCanExitApp();
Nonzero, wenn die Anwendung beendet werden kann; andernfalls 0.
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 Hauptfenster der Anwendung ausgeblendet (nicht zerstört), wenn der Benutzer im Systemmenü "Schließen" oder "Beenden" aus dem Menü "Datei" auswählt. Das Framework ruft diese Funktion in CFrameWnd::OnClose
.
// 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;
}
}
Header: afxdisp.h
Ruft den aktuellen Nachrichtenfilter der Anwendung ab.
COleMessageFilter* AFXAPI AfxOleGetMessageFilter();
Ein Zeiger auf den aktuellen Nachrichtenfilter.
Rufen Sie diese Funktion auf, um auf das aktuelle COleMessageFilter
abgeleitete Objekt zuzugreifen, genauso wie Sie den Zugriff auf das aktuelle Anwendungsobjekt aufrufen AfxGetApp
würden.
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();
}
//...
//...
//...
}
Header: afxwin.h
Ruft das aktuelle Benutzersteuerelement-Flag ab.
BOOL AFXAPI AfxOleGetUserCtrl();
Nonzero, wenn der Benutzer die Kontrolle über die Anwendung hat; andernfalls 0.
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.
Header: afxdisp.h
Legt das Flag des Benutzersteuerelements fest oder löscht sie, das in der Referenz für AfxOleGetUserCtrl
.
void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);
bUserCtrl
Gibt an, ob das Benutzersteuerelement-Flag festgelegt oder gelöscht werden soll.
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.
Header: afxdisp.h
Erhöht die globale Anzahl der aktiven Objekte in der Anwendung.
void AFXAPI AfxOleLockApp();
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.
// 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();
}
Header: afxdisp.h
Erhöht die Anzahl der aktiven Objekte in der Anwendung.
void AFXAPI AfxOleUnlockApp();
Weitere Informationen finden Sie AfxOleLockApp
unter.
Wenn die Anzahl der aktiven Objekte null erreicht, AfxOleOnReleaseAllObjects
wird sie aufgerufen.
Sehen Sie sich das Beispiel für AfxOleLockApp an.
Header: afxdisp.h
Sperrt die Klassenfactory des angegebenen Steuerelements, sodass dynamisch erstellte Daten, die dem Steuerelement zugeordnet sind, im Arbeitsspeicher verbleiben.
BOOL AFXAPI AfxOleLockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );
clsid
Die eindeutige Klassen-ID des Steuerelements.
lpszProgID
Die eindeutige Programm-ID des Steuerelements.
Nonzero, wenn die Klassenfabrik des Steuerelements erfolgreich gesperrt wurde; andernfalls 0.
Dies kann die Anzeige der Steuerelemente erheblich beschleunigen. Wenn Sie beispielsweise ein Steuerelement in einem Dialogfeld erstellen und das Steuerelement mit AfxOleLockControl
sperren, 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 AfxOleUnlockControl
auf.
// 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"));
Header: afxwin.h
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);
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.
IDispatch
OAT_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.
Nonzero, wenn die Serverklasse erfolgreich registriert wurde; andernfalls 0.
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 |
Header: afxdisp.h
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);
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".
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>
Kopfzeile: afxole.h
Entsperrt die Klassenfactory des angegebenen Steuerelements.
BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );
clsid
Die eindeutige Klassen-ID des Steuerelements.
lpszProgID
Die eindeutige Programm-ID des Steuerelements.
Nonzero, wenn die Klassenfactory des Steuerelements erfolgreich entsperrt wurde; andernfalls 0.
Ein Steuerelement ist gesperrt AfxOleLockControl
, sodass dynamisch erstellte Daten, die dem Steuerelement zugeordnet sind, im Arbeitsspeicher verbleiben. 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 AfxOleUnlockControl
auf.
// Unlock control's (Microsoft Calendar Control) class factory.
AfxOleUnlockControl(_T("MSCAL.Calendar"));
Header: afxwin.h