Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : Outlook 2013 | Outlook 2016
Avant de pouvoir utiliser un complément d’état hors connexion pour surveiller les changements d’état de connexion, vous devez implémenter des fonctions pour configurer et initialiser le complément. Pour plus d’informations, consultez Configuration d’un complément d’état hors connexion.
Après avoir configuré le complément d’état hors connexion, vous devez utiliser la fonction HrOpenOfflineObj pour obtenir un objet hors connexion. À l’aide de cet objet hors connexion, vous pouvez initialiser votre moniteur d’état, puis obtenir et définir l’état actuel.
Dans cette rubrique, ces fonctions de surveillance de l’état sont illustrées à l’aide d’exemples de code de l’exemple de complément d’état hors connexion. L’exemple de complément d’état hors connexion est un complément COM qui ajoute un menu État hors connexion à Outlook et utilise l’API d’état hors connexion. Dans le menu État hors connexion, vous pouvez activer ou désactiver la surveillance de l’état, case activée l’état actuel et modifier l’état actuel. Pour plus d’informations sur le téléchargement et l’installation de l’exemple de complément d’état hors connexion, reportez-vous à l’article Installation de l’exemple de complément d’état hors connexion. Pour plus d’informations sur l’API d’état hors connexion, reportez-vous à l’article À propos de l’API d’état hors connexion.
Lorsque le complément d’état hors connexion est déconnecté, vous devez implémenter des fonctions pour l’arrêter et le nettoyer correctement. Pour plus d’informations, consultez Déconnexion d’un complément d’état hors connexion.
Ouvrir la routine d’objet hors connexion
Pour que le client soit averti lorsqu’un changement d’état de connexion se produit, vous devez appeler la fonction HrOpenOfflineObj . Cette fonction ouvre un objet hors connexion qui prend en charge IMAPIOfflineMgr. La fonction HrOpenOfflineObj est définie dans le fichier d’en-tête ConnectionState.h.
Remarque
La fonction HrOpenOfflineObj est déclarée dans le fichier d’en-tête ImportProcs.h comme suit : extern HROPENOFFLINEOBJ* pfnHrOpenOfflineObj;.
Exemple HrOpenOfflineObj
typedef HRESULT (STDMETHODCALLTYPE HROPENOFFLINEOBJ)(
ULONG ulFlags,
LPCWSTR pwszProfileName,
const GUID* pGUID,
const GUID* pInstance,
IMAPIOfflineMgr** ppOffline
);
Initialiser la routine monitor
La InitMonitor fonction appelle la fonction HrOpenOfflineObj . La InitMonitor fonction appelle CMyOfflineNotify afin qu’Outlook puisse envoyer des notifications de rappel au client et inscrit le rappel via la variable AdviseInfoMAPIOFFLINE_ADVISEINFO .
Exemple InitMonitor()
void InitMonitor(LPCWSTR szProfile)
{
if (!szProfile) return;
Log(true,_T("Initializing Outlook Offline State Monitor\n"));
HRESULT hRes = S_OK;
if (g_lpOfflineMgr)
{
Log(true,_T("Already initialized\n"));
return;
}
if (pfnHrOpenOfflineObj)
{
if (g_lpOfflineMgr) DeInitMonitor();
Log(true,_T("Calling HrOpenOfflineObj for \"%ws\"\n"),szProfile);
hRes = pfnHrOpenOfflineObj(
NULL,
szProfile,
&GUID_GlobalState,
NULL,
&g_lpOfflineMgr);
if (FAILED(hRes))
{
Log(true,_T("HrOpenOfflineObj failed: 0x%08X\n"),hRes);
}
if (g_lpOfflineMgr)
{
IMAPIOffline* lpOffline = NULL;
hRes = g_lpOfflineMgr->QueryInterface(IID_IMAPIOffline,(LPVOID*)&lpOffline);
if (lpOffline)
{
ULONG ulCap = NULL;
hRes = lpOffline->GetCapabilities(&ulCap);
if (ulCap & MAPIOFFLINE_CAPABILITY_OFFLINE) Log(true,_T("MAPIOFFLINE_CAPABILITY_OFFLINE supported\n"));
if (ulCap & MAPIOFFLINE_CAPABILITY_ONLINE) Log(true,_T("MAPIOFFLINE_CAPABILITY_ONLINE supported\n"));
if (ulCap & (MAPIOFFLINE_CAPABILITY_OFFLINE | MAPIOFFLINE_CAPABILITY_ONLINE))
{
CMyOfflineNotify* lpImplNotify = new CMyOfflineNotify();
if (lpImplNotify)
{
MAPIOFFLINE_ADVISEINFO AdviseInfo = {0};
AdviseInfo.ulSize = sizeof(MAPIOFFLINE_ADVISEINFO);
AdviseInfo.ulClientToken = 0;// something you want to get handed back when you get the notification
AdviseInfo.CallbackType = MAPIOFFLINE_CALLBACK_TYPE_NOTIFY;
AdviseInfo.pCallback = lpImplNotify;
AdviseInfo.ulAdviseTypes = MAPIOFFLINE_ADVISE_TYPE_STATECHANGE;
AdviseInfo.ulStateMask = MAPIOFFLINE_STATE_ALL;
hRes = g_lpOfflineMgr->Advise(MAPIOFFLINE_ADVISE_DEFAULT, &AdviseInfo, &g_ulAdviseToken);
Log(true,"ulAdviseToken = 0x%08X\n",g_ulAdviseToken);
}
}
lpOffline->Release();
}
}
}
}
Routine Obtenir l’état actuel
La GetCurrentState fonction appelle la fonction HrOpenOfflineObj , puis utilise l’objet hors connexion pour obtenir l’état actuel de la connexion. L’état actuel est retourné dans la ulCurState variable , qui est utilisée dans la CButtonEventHandler::Click fonction pour afficher l’état actuel à l’utilisateur.
Exemple GetCurrentState()
ULONG (LPCWSTR szProfile)
{
if (!szProfile) return 0;
Log(true,_T("Getting Current Offline State\n"));
HRESULT hRes = S_OK;
ULONG ulCurState = NULL;
if (pfnHrOpenOfflineObj)
{
if (g_lpOfflineMgr) DeInitMonitor();
Log(true,_T("Calling HrOpenOfflineObj for \"%ws\"\n"),szProfile);
hRes = pfnHrOpenOfflineObj(
NULL,
szProfile,
&GUID_GlobalState,
NULL,
&g_lpOfflineMgr);
if (FAILED(hRes))
{
Log(true,_T("HrOpenOfflineObj failed: 0x%08X\n"),hRes);
}
if (g_lpOfflineMgr)
{
IMAPIOffline* lpOffline = NULL;
hRes = g_lpOfflineMgr->QueryInterface(IID_IMAPIOffline,(LPVOID*)&lpOffline);
if (lpOffline)
{
hRes = lpOffline->GetCurrentState(&ulCurState);
Log(true,_T("GetCurrentState returned 0x%08X\n"),hRes);
switch(ulCurState)
{
case MAPIOFFLINE_STATE_ONLINE:
Log(true,_T("Current state is MAPIOFFLINE_STATE_ONLINE\n"));
break;
case MAPIOFFLINE_STATE_OFFLINE:
Log(true,_T("Current state is MAPIOFFLINE_STATE_OFFLINE\n"));
break;
default:
Log(true,_T("Current state is 0x%0X\n"),ulCurState);
}
lpOffline->Release();
}
}
}
return ulCurState;
}
Définir la routine d’état actuel
La SetCurrentState fonction appelle la fonction HrOpenOfflineObj , puis utilise l’objet hors connexion pour définir l’état de connexion actuel. La CButtonEventHandler::Click fonction appelle la SetCurrentState fonction et le nouvel état est transmis via la ulState variable .
Exemple SetCurrentState()
HRESULT SetCurrentState(LPCWSTR szProfile, ULONG ulFlags, ULONG ulState)
{
if (!szProfile) return 0;
Log(true,_T("Setting Current Offline State\n"));
HRESULT hRes = S_OK;
if (pfnHrOpenOfflineObj)
{
if (g_lpOfflineMgr) DeInitMonitor();
Log(true,_T("Calling HrOpenOfflineObj for \"%ws\"\n"),szProfile);
hRes = pfnHrOpenOfflineObj(
NULL,
szProfile,
&GUID_GlobalState,
NULL,
&g_lpOfflineMgr);
if (FAILED(hRes))
{
Log(true,_T("HrOpenOfflineObj failed: 0x%08X\n"),hRes);
}
if (g_lpOfflineMgr)
{
IMAPIOffline* lpOffline = NULL;
hRes = g_lpOfflineMgr->QueryInterface(IID_IMAPIOffline,(LPVOID*)&lpOffline);
if (lpOffline)
{
switch(ulFlags)
{
case MAPIOFFLINE_FLAG_BLOCK:
Log(true,_T("Flag used: MAPIOFFLINE_FLAG_BLOCK\n"));
break;
case MAPIOFFLINE_FLAG_DEFAULT:
Log(true,_T("Flag used: MAPIOFFLINE_FLAG_DEFAULT\n"));
break;
default:
Log(true,_T("Flag used: 0x%0X\n"),ulFlags);
}
switch(ulState)
{
case MAPIOFFLINE_STATE_ONLINE:
Log(true,_T("New state will be MAPIOFFLINE_STATE_ONLINE\n"));
break;
case MAPIOFFLINE_STATE_OFFLINE:
Log(true,_T("New state will be MAPIOFFLINE_STATE_OFFLINE\n"));
break;
default:
Log(true,_T("New state will be 0x%0X\n"),ulState);
}
hRes = lpOffline->SetCurrentState(ulFlags, MAPIOFFLINE_STATE_OFFLINE_MASK,ulState,NULL);
Log(true,_T("SetCurrentState returned 0x%08X\n"),hRes);
lpOffline->Release();
}
}
}
return hRes;
}
Routine de notification
La fonction IMAPIOfflineNotify ::Notify est utilisée par Outlook pour envoyer des notifications à un client en cas de modification de l’état de connexion.
Exemple CMyOfflineNotify ::Notify()
void CMyOfflineNotify::Notify(const MAPIOFFLINE_NOTIFY *pNotifyInfo)
{
Log(true,_T("CMyOfflineNotify::Notify\n"));
if (pNotifyInfo == NULL)
{
Log(true,_T("pNotifyInfo is NULL\n"));
}
else
{
Log(true,_T("pNotifyInfo->ulSize == 0x%0X\n"),pNotifyInfo->ulSize);
switch(pNotifyInfo->NotifyType)
{
case MAPIOFFLINE_NOTIFY_TYPE_STATECHANGE:
Log(true,_T("pNotifyInfo->NotifyType == MAPIOFFLINE_NOTIFY_TYPE_STATECHANGE\n"));
break;
case MAPIOFFLINE_NOTIFY_TYPE_STATECHANGE_START:
Log(true,_T("pNotifyInfo->NotifyType == MAPIOFFLINE_NOTIFY_TYPE_STATECHANGE_START\n"));
break;
case MAPIOFFLINE_NOTIFY_TYPE_STATECHANGE_DONE:
Log(true,_T("pNotifyInfo->NotifyType == MAPIOFFLINE_NOTIFY_TYPE_STATECHANGE_DONE\n"));
break;
default:
Log(true,_T("pNotifyInfo->NotifyType == 0x%08X\n"),pNotifyInfo->NotifyType);
}
Log(true,_T("pNotifyInfo->ulClientToken == 0x%0X\n"),pNotifyInfo->ulClientToken);
switch(pNotifyInfo->Info.StateChange.ulMask)
{
case MAPIOFFLINE_STATE_OFFLINE_MASK:
Log(true,_T("pNotifyInfo->Info.StateChange.ulMask == MAPIOFFLINE_STATE_OFFLINE_MASK\n"));
break;
default:
Log(true,_T("pNotifyInfo->Info.StateChange.ulMask == 0x%0X\n"),pNotifyInfo->Info.StateChange.ulMask);
}
switch(pNotifyInfo->Info.StateChange.ulStateOld)
{
case MAPIOFFLINE_STATE_ONLINE:
Log(true,_T("pNotifyInfo->Info.StateChange.ulStateOld == MAPIOFFLINE_STATE_ONLINE\n"));
break;
case MAPIOFFLINE_STATE_OFFLINE:
Log(true,_T("pNotifyInfo->Info.StateChange.ulStateOld == MAPIOFFLINE_STATE_OFFLINE\n"));
break;
default:
Log(true,_T("pNotifyInfo->Info.StateChange.ulStateOld == 0x%0X\n"),pNotifyInfo->Info.StateChange.ulStateOld);
}
switch(pNotifyInfo->Info.StateChange.ulStateNew)
{
case MAPIOFFLINE_STATE_ONLINE:
Log(true,_T("pNotifyInfo->Info.StateChange.ulStateNew == MAPIOFFLINE_STATE_ONLINE\n"));
break;
case MAPIOFFLINE_STATE_OFFLINE:
Log(true,_T("pNotifyInfo->Info.StateChange.ulStateNew == MAPIOFFLINE_STATE_OFFLINE\n"));
break;
default:
Log(true,_T("pNotifyInfo->Info.StateChange.ulStateNew == 0x%0X\n"),pNotifyInfo->Info.StateChange.ulStateNew);
}
}
return;
}