Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: Outlook 2013 | Outlook 2016
Antes de usar um suplemento de estado offline para monitorar as alterações de estado de conexão, você deve implementar funções para configurar e inicializar o suplemento. Para obter mais informações, consulte Configurando um suplemento de estado offline.
Depois de configurar o suplemento de estado offline, você deve usar a função HrOpenOfflineObj para obter um objeto offline. Usando esse objeto offline, você pode inicializar o monitor de estado e, em seguida, obter e definir o estado atual.
Neste tópico, essas funções de monitoramento de estado são demonstradas usando exemplos de código do Suplemento de Estado Offline de Exemplo. O Suplemento de Estado Offline de Exemplo é um suplemento COM que adiciona um menu Estado Offline ao Outlook e utiliza a API de Estado Offline. Por meio do menu Estado Offline, você pode habilitar ou desabilitar o monitoramento de estado, marcar estado atual e alterar o estado atual. Para saber mais sobre como baixar e instalar a Amostra de Suplemento de Estado Offline, confira Instalação da Amostra de Suplemento de Estado Offline. Confira mais informações sobre a API de Estado Offline em Sobre a API de Estado Offline.
Quando o suplemento de estado offline está desconectado, você precisa implementar funções para encerrar corretamente e limpar o suplemento. Para obter mais informações, confira Desconectar um suplemento de estado offline.
Abrir rotina de objeto offline
Para que o cliente seja notificado quando ocorrer uma alteração de estado de conexão, você deve chamar a função HrOpenOfflineObj . Essa função abre um objeto offline que dá suporte a IMAPIOfflineMgr. A função HrOpenOfflineObj é definida no arquivo de cabeçalho ConnectionState.h.
Observação
A função HrOpenOfflineObj é declarada no arquivo de cabeçalho ImportProcs.h da seguinte maneira: extern HROPENOFFLINEOBJ* pfnHrOpenOfflineObj;.
Exemplo hrOpenOfflineObj
typedef HRESULT (STDMETHODCALLTYPE HROPENOFFLINEOBJ)(
ULONG ulFlags,
LPCWSTR pwszProfileName,
const GUID* pGUID,
const GUID* pInstance,
IMAPIOfflineMgr** ppOffline
);
Inicializar rotina do Monitor
A InitMonitor função chama a função HrOpenOfflineObj . A InitMonitor função chama CMyOfflineNotify para que o Outlook possa enviar notificações de retorno de chamada para o cliente e registre o retorno de chamada por meio da variável AdviseInfoMAPIOFFLINE_ADVISEINFO .
Exemplo do 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();
}
}
}
}
Obter rotina de estado atual
A GetCurrentState função chama a função HrOpenOfflineObj e usa o objeto offline para obter o estado de conexão atual. O estado atual é retornado na ulCurState variável, que é usada na CButtonEventHandler::Click função para exibir o estado atual para o usuário.
Exemplo 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;
}
Definir rotina de estado atual
A SetCurrentState função chama a função HrOpenOfflineObj e usa o objeto offline para definir o estado de conexão atual. A CButtonEventHandler::Click função chama a SetCurrentState função e o novo estado é passado pela ulState variável.
Exemplo de 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;
}
Rotina de notificação
A função IMAPIOfflineNotify::Notify é usada pelo Outlook para enviar notificações a um cliente quando há alterações no estado de conexão.
Exemplo 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;
}