Contrôle d'application
OLE nécessite un contrôle substantiel sur les applications et leurs objets. Les DLL système OLE doivent être en mesure de lancer et de libérer automatiquement des applications, de coordonner leur production et leur modification d’objets, et ainsi de suite. Les fonctions de cette rubrique répondent à ces exigences. En plus d’être appelées par les DLL système OLE, ces fonctions doivent parfois être appelées par des applications.
Contrôle d'application
Nom | Description |
---|---|
AfxOleCanExitApp | Indique si l’application peut se terminer. |
AfxOleGetMessageFilter | Récupère le filtre de message actuel de l’application. |
AfxOleGetUserCtrl | Récupère l’indicateur de contrôle utilisateur actuel. |
AfxOleSetUserCtrl | Définit ou efface l’indicateur de contrôle utilisateur. |
AfxOleLockApp | Incrémente le nombre global d’objets actifs de l’infrastructure dans une application. |
AfxOleLockControl | Verrouille la fabrique de classe du contrôle spécifié. |
AfxOleUnlockApp | Décrémente le nombre d’objets actifs dans une application. |
AfxOleUnlockControl | Déverrouille la fabrique de classe du contrôle spécifié. |
AfxOleRegisterServerClass | Inscrit un serveur dans le registre du système OLE. |
AfxOleSetEditMenu | Implémente l’interface utilisateur de la commande Typename Object. |
AfxOleCanExitApp
Indique si l’application peut se terminer.
BOOL AFXAPI AfxOleCanExitApp();
Valeur de retour
Différent de zéro si l’application peut quitter ; sinon 0.
Notes
Une application ne doit pas se terminer s’il existe des références en attente à ses objets. Les fonctions AfxOleLockApp
globales et AfxOleUnlockApp
incrémentent et décrémentent, respectivement, un compteur de références aux objets de l’application. L’application ne doit pas se terminer lorsque ce compteur n’est pas zéro. Si le compteur n’est pas différent de zéro, la fenêtre principale de l’application est masquée (non détruite) lorsque l’utilisateur choisit Fermer dans le menu système ou quittez le menu Fichier. L’infrastructure appelle cette fonction dans CFrameWnd::OnClose
.
Exemple
// 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;
}
}
Spécifications
En-tête : afxdisp.h
AfxOleGetMessageFilter
Récupère le filtre de message actuel de l’application.
COleMessageFilter* AFXAPI AfxOleGetMessageFilter();
Valeur de retour
Pointeur vers le filtre de message actuel.
Notes
Appelez cette fonction pour accéder à l’objet dérivé actuel COleMessageFilter
, tout comme vous l’appeliez AfxGetApp
pour accéder à l’objet d’application actuel.
Exemple
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();
}
//...
//...
//...
}
Spécifications
En-tête : afxwin.h
AfxOleGetUserCtrl
Récupère l’indicateur de contrôle utilisateur actuel.
BOOL AFXAPI AfxOleGetUserCtrl();
Valeur de retour
Différent de zéro si l’utilisateur est dans le contrôle de l’application ; sinon 0.
Notes
L’utilisateur contrôle l’application lorsque l’utilisateur a ouvert ou créé explicitement un document. L’utilisateur est également en contrôle si l’application n’a pas été lancée par les DLL système OLE , en d’autres termes, si l’utilisateur a lancé l’application avec l’interpréteur de commandes système.
Spécifications
En-tête : afxdisp.h
AfxOleSetUserCtrl
Définit ou efface l’indicateur de contrôle utilisateur, qui est expliqué dans la référence pour AfxOleGetUserCtrl
.
void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);
Paramètres
bUserCtrl
Spécifie si l’indicateur de contrôle utilisateur doit être défini ou effacé.
Notes
L’infrastructure appelle cette fonction lorsque l’utilisateur crée ou charge un document, mais pas lorsqu’un document est chargé ou créé par le biais d’une action indirecte telle que le chargement d’un objet incorporé à partir d’une application conteneur.
Appelez cette fonction si d’autres actions de votre application doivent placer l’utilisateur dans le contrôle de l’application.
Spécifications
En-tête : afxdisp.h
AfxOleLockApp
Incrémente le nombre global d’objets actifs de l’infrastructure dans l’application.
void AFXAPI AfxOleLockApp();
Notes
L’infrastructure conserve le nombre d’objets actifs dans une application. Les AfxOleLockApp
fonctions et AfxOleUnlockApp
les fonctions, respectivement, incrémentent et décrémentent ce nombre.
Lorsque l’utilisateur tente de fermer une application qui a des objets actifs ( une application pour laquelle le nombre d’objets actifs n’est pas zéro), l’infrastructure masque l’application de la vue de l’utilisateur au lieu de l’arrêter complètement. La AfxOleCanExitApp
fonction indique si l’application peut se terminer.
Appel AfxOleLockApp
à partir d’un objet qui expose des interfaces OLE, s’il serait indésirable que cet objet soit détruit tout en étant toujours utilisé par une application cliente. Appelez AfxOleUnlockApp
également le destructeur de n’importe quel objet qui appelle AfxOleLockApp
le constructeur. Par défaut, COleDocument
(et les classes dérivées) verrouillent et déverrouillent automatiquement l’application.
Exemple
// 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();
}
Spécifications
En-tête : afxdisp.h
AfxOleUnlockApp
Décrémente le nombre d’objets actifs de l’infrastructure dans l’application.
void AFXAPI AfxOleUnlockApp();
Notes
Consultez AfxOleLockApp
pour plus d’informations.
Lorsque le nombre d’objets actifs atteint zéro, AfxOleOnReleaseAllObjects
est appelé.
Exemple
Consultez l’exemple d’AfxOleLockApp.
Spécifications
En-tête : afxdisp.h
AfxOleLockControl
Verrouille la fabrique de classe du contrôle spécifié afin que les données créées dynamiquement associées au contrôle restent en mémoire.
Syntaxe
BOOL AFXAPI AfxOleLockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );
Paramètres
clsid
ID de classe unique du contrôle.
lpszProgID
ID de programme unique du contrôle.
Valeur de retour
Différent de zéro si la fabrique de classe du contrôle a été correctement verrouillée ; sinon 0.
Notes
Cela peut accélérer considérablement l’affichage des contrôles. Par exemple, une fois que vous avez créé un contrôle dans une boîte de dialogue et que vous verrouillez le contrôle avec AfxOleLockControl
, vous n’avez pas besoin de le créer et de le tuer à chaque fois que le dialogue est affiché ou détruit. Si l’utilisateur ouvre et ferme une boîte de dialogue à plusieurs reprises, le verrouillage de vos contrôles peut améliorer considérablement les performances. Lorsque vous êtes prêt à détruire le contrôle, appelez AfxOleUnlockControl
.
Exemple
// 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"));
Spécifications
En-tête : afxwin.h
AfxOleRegisterServerClass
Cette fonction vous permet d’inscrire votre serveur dans le registre du système OLE.
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid,
LPCTSTR lpszClassName,
LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName,
OLE_APPTYPE nAppType = OAT_SERVER,
LPCTSTR* rglpszRegister = NULL,
LPCTSTR* rglpszOverwrite = NULL);
Paramètres
clsid
Référence à l’ID de classe OLE du serveur.
lpszClassName
Pointeur vers une chaîne contenant le nom de classe des objets du serveur.
lpszShortTypeName
Pointeur vers une chaîne contenant le nom court du type d’objet du serveur, tel que « Chart ».
lpszLongTypeName
Pointeur vers une chaîne contenant le nom long du type d’objet du serveur, tel que « Graphique Microsoft Excel 5.0 ».
nAppType
Valeur, extraite de l’énumération OLE_APPTYPE, spécifiant le type d’application OLE. Les valeurs possibles sont les suivantes :
OAT_INPLACE_SERVER Server dispose d’une interface utilisateur de serveur complète.
OAT_SERVER Server prend uniquement en charge l’incorporation.
OAT_CONTAINER Container prend en charge les liens vers des incorporations.
IDispatch
OAT_DISPATCH_OBJECT objet compatible.
rglpszRegister
Tableau de pointeurs vers des chaînes représentant les clés et les valeurs à ajouter au registre du système OLE si aucune valeur existante pour les clés n’est trouvée.
rglpszOverwrite
Tableau de pointeurs vers des chaînes représentant les clés et les valeurs à ajouter au registre système OLE si le Registre contient des valeurs existantes pour les clés données.
Valeur de retour
Différent de zéro si la classe de serveur est correctement inscrite ; sinon 0.
Notes
La plupart des applications peuvent utiliser COleTemplateServer::Register
pour inscrire les types de documents de l’application. Si le format de registre système de votre application ne correspond pas au modèle classique, vous pouvez l’utiliser AfxOleRegisterServerClass
pour plus de contrôle.
Le Registre se compose d’un ensemble de clés et de valeurs. Les arguments rglpszRegister et rglpszOverwrite sont des tableaux de pointeurs vers des chaînes, chacun composé d’une clé et d’une valeur séparée par un caractère NULL ( '\0'
). Chacune de ces chaînes peut avoir des paramètres remplaçables dont les emplacements sont marqués par les séquences de caractères %1 à %5.
Les symboles sont renseignés comme suit :
Symbole | Valeur |
---|---|
1% | ID de classe, mis en forme en tant que chaîne |
2 % | Nom de classe |
3 % | Chemin d’accès au fichier exécutable |
4 % | Nom de type court |
5 % | Nom de type long |
Spécifications
En-tête : afxdisp.h
AfxOleSetEditMenu
Implémente l’interface utilisateur de la commande Typename Object.
void AFXAPI AfxOleSetEditMenu(
COleClientItem* pClient,
CMenu* pMenu,
UINT iMenuItem,
UINT nIDVerbMin,
UINT nIDVerbMax = 0,
UINT nIDConvert = 0);
Paramètres
pClient
Pointeur vers l’élément OLE client.
pMenu
Pointeur vers l’objet de menu à mettre à jour.
iMenuItem
Index de l’élément de menu à mettre à jour.
nIDVerbMin
ID de commande qui correspond au verbe principal.
nIDVerbMax
ID de commande qui correspond au dernier verbe.
nIDConvert
ID de l’élément de menu Convertir.
Notes
Si le serveur reconnaît uniquement un verbe principal, l’élément de menu devient « verb typename Object » et la commande nIDVerbMin est envoyée lorsque l’utilisateur choisit la commande. Si le serveur reconnaît plusieurs verbes, l’élément de menu devient « typename Object » et un sous-menu listant tous les verbes s’affiche lorsque l’utilisateur choisit la commande. Lorsque l’utilisateur choisit un verbe dans le sous-menu, nIDVerbMin est envoyé si le premier verbe est choisi, nIDVerbMin + 1 est envoyé si le deuxième verbe est choisi, et ainsi de suite. L’implémentation par défaut COleDocument
gère automatiquement cette fonctionnalité.
Vous devez disposer de l’instruction suivante dans le script de ressource d’application de votre client (. Fichier RC) :
<#include afxolecl.rc>
Spécifications
En-tête : afxole.h
AfxOleUnlockControl
Déverrouille la fabrique de classe du contrôle spécifié.
Syntaxe
BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );
Paramètres
clsid
ID de classe unique du contrôle.
lpszProgID
ID de programme unique du contrôle.
Valeur de retour
Différent de zéro si la fabrique de classe du contrôle a été déverrouillée avec succès ; sinon 0.
Notes
Un contrôle est verrouillé avec AfxOleLockControl
, de sorte que les données créées dynamiquement associées au contrôle restent en mémoire. Cela peut accélérer considérablement l’affichage du contrôle, car le contrôle n’a pas besoin d’être créé et détruit chaque fois qu’il est affiché. Lorsque vous êtes prêt à détruire le contrôle, appelez AfxOleUnlockControl
.
Exemple
// Unlock control's (Microsoft Calendar Control) class factory.
AfxOleUnlockControl(_T("MSCAL.Calendar"));
Spécifications
En-tête : afxwin.h