ultimatepp/bazaar/MAPIEx/plugin/Test/MAPIService/MAPIService.cpp
koldo b18a9b6136 MAPIEx: Outlook automation
git-svn-id: svn://ultimatepp.org/upp/trunk@3391 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-05-01 21:46:26 +00:00

132 lines
4 KiB
C++

////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: MAPIService.cpp
// Description: Example of using CMAPIEx in a windows service
//
// Copyright (C) 2005-2011, Noel Dillabough
//
// This source code is free to use and modify provided this notice remains intact and that any enhancements
// or bug fixes are posted to the CodeProject page hosting this class for the community to benefit.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "MAPIService.h"
// To make deploying the service easier, I'm linking MAPIEx as a library; to use the DLL instead comment out the following lines
// and change the dependency to MAPIEx
#undef AFX_EXT_CLASS
#define AFX_EXT_CLASS
#include "../../MAPIEx.h"
// Service globals
#define SERVICE_NAME _T("MAPIExService")
SERVICE_STATUS status;
SERVICE_STATUS_HANDLE hStatus;
CMAPIEx mapi;
#ifdef UNICODE
#define PRINTF wprintf
#else
#define PRINTF printf
#endif
void SetStatus(DWORD dwStatus, DWORD dwExitCode=0)
{
status.dwCurrentState=dwStatus;
status.dwWin32ExitCode=dwExitCode;
SetServiceStatus(hStatus, &status);
}
void ControlHandler(DWORD dwControl)
{
if(dwControl==SERVICE_CONTROL_STOP || dwControl==SERVICE_CONTROL_SHUTDOWN)
{
SetStatus(SERVICE_STOPPED);
mapi.Logout();
CMAPIEx::Term();
}
}
BOOL InstallService(SC_HANDLE hManager)
{
TCHAR szPath[_MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), szPath, _MAX_PATH);
SC_HANDLE hService=CreateService(hManager, SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, szPath, NULL, NULL, NULL, NULL, NULL);
if(!hService) return FALSE;
SERVICE_DESCRIPTION desc;
desc.lpDescription=_T("MAPIEx sample service");
ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &desc);
CloseServiceHandle(hService);
return TRUE;
}
long CALLBACK OnNewMessage(LPVOID lpvContext, ULONG cNotification, LPNOTIFICATION lpNotifications)
{
// I'm just doing a beep here when a new mail arrives
MessageBeep(-1);
return 0;
}
void ServiceMain(int argc, char** argv)
{
memset(&status, 0, sizeof(SERVICE_STATUS));
status.dwServiceType=SERVICE_WIN32;
status.dwCurrentState=SERVICE_START_PENDING;
status.dwControlsAccepted=SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
hStatus=RegisterServiceCtrlHandler(SERVICE_NAME, (LPHANDLER_FUNCTION)ControlHandler);
if(!hStatus) return;
// initialize MAPI, and turn on notifications for new mail
if(!CMAPIEx::Init(0, TRUE) || !mapi.Login(NULL, 0, TRUE) || !mapi.OpenMessageStore() || !mapi.Notify(OnNewMessage, NULL, fnevNewMail))
{
SetStatus(SERVICE_STOPPED, -1);
return;
}
// sleep while running, checking every few seconds
SetStatus(SERVICE_RUNNING);
while(status.dwCurrentState==SERVICE_RUNNING)
{
Sleep(4000);
}
ControlHandler(SERVICE_CONTROL_SHUTDOWN);
}
void main(int argc, char* argv[])
{
if(argc>1)
{
SC_HANDLE hManager=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(hManager)
{
SC_HANDLE hService=OpenService(hManager, SERVICE_NAME, SERVICE_ALL_ACCESS);
if(!_tcscmp(argv[1], _T("-i")))
{
if(InstallService(hManager)) PRINTF("Installed %s successfully.\n", SERVICE_NAME);
else PRINTF("Failed to install %s.\n", SERVICE_NAME);
} else if(!_tcscmp(argv[1], _T("-u")))
{
if(hService && DeleteService(hService)) PRINTF("Uninstalled %s successfully.\n", SERVICE_NAME);
else PRINTF("Failed to uninstall %s.\n", SERVICE_NAME);
} else {
PRINTF(_T("Usage:\n"));
PRINTF(_T("\t-i\tInstall Service\n"));
PRINTF(_T("\t-u\tUninstall Service\n"));
}
if(hService) CloseServiceHandle(hService);
CloseServiceHandle(hManager);
}
return;
}
SERVICE_TABLE_ENTRY table[]={
{ SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
StartServiceCtrlDispatcher(table);
}