Re: Windows NT service
On May 29, 2:36 pm, sriramga...@gmail.com wrote:
I have a service which polls for images in a particular directory and
this happens to be working fine when i start the service after the
images come in to the folder.the images keep coming in to the folde
rand my windows service's job is to poll it regularly...when the
service is running and when the images come in to the folder...it
doesnt poll...but when i stop and start the service again the job gets
done...so can anyone tell me what may be issue?
#include <io.h>
//Windows Service Include File
//***************************************
#include <Winsvc.h>
//***************************************
#include <shlwapi.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//Windows Service Define Statements
//******************************************************
#define WAIT_SERVICE_AUTO_RESTART 60000
#define ServiceName "GatewayService"
#define DisplayName "Gateway NT Service"
#define EVENTLOG_FILENAME "GatewayService.txt"
//*********************************************************
// The one and only application object
CWinApp theApp;
using namespace std;
//Start of the Windows Gateway Service Service
//******************************************
SERVICE_STATUS GatewayServiceStatus;
SERVICE_STATUS_HANDLE GatewayServiceStatusHandle;
BOOL m_bStop = FALSE;
BOOL m_bPause = FALSE;
//code added
/*BOOL bWaitingForStop = FALSE;
CCriticalSection loglatch, deletelatch, compresslatch, stoplatch;
CThreadTimer m_DeleteTimer;
CThreadTimer m_QueryTimer;*/
VOID WINAPI GatewayServiceStart (DWORD argc, LPTSTR *argv);
VOID WINAPI GatewayServiceCtrlHandler (DWORD opcode);
BOOL ReportServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD
dwWaitHint);
BOOL InstallGatewayService();
BOOL UnInstallGatewayService();
void GetRegFileName(CString &strName);
BOOL ReadRegInfo();
CString appFolder;
CString m_RegFileName;
CString m_sLogName, m_sLogPassword, m_sLogDomain;
void GetLogAccount(void);
void GatewayServerShutDown();
bool FindMatrixTAG(LDicomDS *pDS);
using namespace std;
// Start of the Gateway function
int GateWayStartup();
CString GetScanDir();
CString LoadConnectionString(CString m_AppFolder);
BOOL LeadToolsInit();
void ExtractInstitDetails(CString szInstIds);
CString ParseFileAndGetInstIds(LDicomDS *pDS);
// Variables
CString m_appFolder;
CStringArray m_saFileNames;
LDicomDS* m_pDS = NULL;
L_UINT16 m_uRet;
pDICOMELEMENT m_pElement = NULL;
CString m_szSrcInstId = _T("");
CString m_szDestInstId = _T("");
CString m_szUserId = _T("");
CUpdateDatabase m_objUpdateDatabase;
CString m_szSOPInstGUID;
VOID SvcDebugOut(CString String)
{
CTime theTime = CTime::GetCurrentTime();
CString sMsg = theTime.Format("%m/%d/%Y %H:%M:%S");
sMsg += " *** " + String;
CStdioFile file;
if(file.Open(m_appFolder+"GatewayService.txt", CFile::modeCreate |
CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText))
{
file.SeekToEnd();
file.WriteString(_T("\n")+sMsg);
file.Close();
}
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
/*int iRetCode;
m_pDS = new LDicomDS;
m_objUpdateDatabase.SetApplicationPath(m_appFolder);
iRetCode = GateWayStartup();
if (m_pDS)
{
delete m_pDS;
CString szRetVal = _T("");
szRetVal.Format(_T("%d"),iRetCode);
cout<<_T("Return Value :") + szRetVal<<endl;
cout<<_T("Please press any key to exit")<<endl;
getchar();
return iRetCode;
}
}*/
GetRegFileName(m_RegFileName);
/// Get AppFolder ///////////////////////
TCHAR szBuffer[256] = {'\0'};
if (GetModuleFileName(NULL, szBuffer, 256))
{
appFolder = szBuffer;
appFolder = appFolder.Left(appFolder.ReverseFind('\\') + 1);
}
/////////////////////////////////////
if(argc>1)
{
if(strcmp(argv[1],"-i")==0)
{
if(InstallGatewayService())
printf("\n\nGatewayService Installed Sucessfully\n");
else
printf("\n\nError Installing GatewayService\n");
}
else if(strcmp(argv[1],"-u")==0)
{
if(UnInstallGatewayService())
printf("\n\nGatewayService UnInstalled Sucessfully\n");
else
printf("\n\nError UnInstalling GatewayService\n");
}
else
{
printf("\n\nUnknown Switch Usage\n\nFor Install use GatewayService -
i\nFor UnInstall use GatewayService -u\n");
}
}
else
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ ServiceName, GatewayServiceStart},
{ NULL, NULL }
};
if(!StartServiceCtrlDispatcher(DispatchTable))
{
CString sMsg;
sMsg.Format("[GATEWAY_SERVICE] StartServiceCtrlDispatcher error = %d
\n", GetLastError());
SvcDebugOut(sMsg);
}
{
GatewayServiceStart(NULL,NULL);
}
}
}
void WINAPI GatewayServiceStart(DWORD argc, LPTSTR *argv)
{
CString sMsg;
BOOL success;
int iRetCode=0;
GatewayServiceStatusHandle=RegisterServiceCtrlHandler(ServiceName,
GatewayServiceCtrlHandler);
if(GatewayServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
sMsg.Format("[GATEWAY_SERVICE] RegisterServiceCtrlHandler failed %d
\n", GetLastError());
SvcDebugOut(sMsg);
return;
}
success=ReportServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,2200);
if(!success)
{
sMsg.Format("[GATEWAY_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
return;
}
success=ReportServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1100);
if(!success)
{
sMsg.Format("[GATEWAY_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
return;
}
success=ReportServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0);
if(!success)
{
sMsg.Format("[GATEWAY_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
return;
}
m_pDS = new LDicomDS;
iRetCode = GateWayStartup();
if (m_pDS)
{
delete m_pDS;
}
if(iRetCode!=0)
{
return;
}
MSG msg;
BOOL bRet;
while (!m_bStop)//WaitForSingleObject(killServiceEvent,100) !=
WAIT_OBJECT_0)
{
if(m_bPause)
{
Sleep(1000);
}
else
{
bRet = ::GetMessage( &msg, NULL, 0, 0 );
if (bRet == 0 || bRet == -1 )
{
if( bRet == 0 )
{
sMsg = _T("Message <WM_QUIT> received\n");
SvcDebugOut(sMsg);
}
if(bRet == -1 )
{
sMsg.Format(_T("Error occurred. Last error returned: %u\n"),
GetLastError());
SvcDebugOut(sMsg);
}
}
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}
}
VOID WINAPI GatewayServiceCtrlHandler(DWORD Opcode)
{
BOOL success;
CString sMsg;
switch(Opcode)
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
success=ReportServiceStatus(SERVICE_STOP_PENDING,NO_ERROR,
0,1,2200);
if(!success)
{
sMsg.Format("[Gateway_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
}
GatewayServerShutDown();
//Signal the main thread to end via the boolean variable
InterlockedExchange((LONG volatile*) &m_bStop, TRUE);
return;
case SERVICE_CONTROL_PAUSE:
success=ReportServiceStatus(SERVICE_PAUSE_PENDING,NO_ERROR,
0,1,1100);
if(!success)
{
sMsg.Format("[Gateway_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
}
success=ReportServiceStatus(SERVICE_PAUSED,NO_ERROR,0,0,0);
if(!success)
{
sMsg.Format("[Gateway_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
}
//Signal the main thread to end via the boolean variable
InterlockedExchange((LONG volatile*) &m_bPause, TRUE);
return;
case SERVICE_CONTROL_CONTINUE:
success=ReportServiceStatus(SERVICE_CONTINUE_PENDING,NO_ERROR,
0,1,1100);
if(!success)
{
sMsg.Format("[Gateway_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
}
success=ReportServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0);
if(!success)
{
sMsg.Format("[Gateway_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
}
//Signal the main thread to end via the boolean variable
InterlockedExchange((LONG volatile*) &m_bPause, FALSE);
return;
case SERVICE_CONTROL_REGISTER:
SvcDebugOut("message SERVICE_CONTROL_REGISTER received\n");
break;
default:
break;
}
// Send current status.
if (!SetServiceStatus (GatewayServiceStatusHandle,
&GatewayServiceStatus))
{
sMsg.Format("[Gateway_SERVICE] SetServiceStatus error %ld
\n",GetLastError());
SvcDebugOut(sMsg);
}
return;
}
BOOL ReportServiceStatus(DWORD dwCurrentState, DWORD
dwWin32ExitCode,DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,
DWORD dwWaitHint)
{
BOOL success;
GatewayServiceStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
GatewayServiceStatus.dwCurrentState=dwCurrentState;
if(dwCurrentState==SERVICE_START_PENDING ||
dwCurrentState==SERVICE_STOP_PENDING ||
dwCurrentState==SERVICE_PAUSE_PENDING ||
dwCurrentState==SERVICE_CONTINUE_PENDING)
{
GatewayServiceStatus.dwControlsAccepted=0;
}
else
{
GatewayServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN |
SERVICE_ACCEPT_PAUSE_CONTINUE;
}
if(dwServiceSpecificExitCode==0)
{
GatewayServiceStatus.dwWin32ExitCode=dwWin32ExitCode;
}
else
{
GatewayServiceStatus.dwWin32ExitCode=ERROR_SERVICE_SPECIFIC_ERROR;
}
//Only pending states can set checkpoints and wait hints
//and pending states *must* set wait hints
if (dwCurrentState==SERVICE_STOPPED ||
dwCurrentState==SERVICE_RUNNING || dwCurrentState==SERVICE_PAUSED)
{
//Requires hint and checkpoint == 0
dwWaitHint = 0;
dwCheckPoint = 0;
}
GatewayServiceStatus.dwServiceSpecificExitCode=dwServiceSpecificExitCode;
GatewayServiceStatus.dwCheckPoint=dwCheckPoint;
GatewayServiceStatus.dwWaitHint=dwWaitHint;
success=SetServiceStatus(GatewayServiceStatusHandle,&GatewayServiceStatus);
if(!success)
{
GatewayServerShutDown();
return success;
}
else
return success;
}
BOOL InstallGatewayService()
{
char strDir[1024];
SC_HANDLE schSCManager,schService;
GetCurrentDirectory(1024,strDir);
strcat(strDir,"\\GatewayService.exe");
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
LPCTSTR lpszBinaryPathName=strDir;
GetLogAccount();
if( m_sLogName.GetLength() )
{
CString sLogAccount, sLogPassword;
if( m_sLogDomain.Compare(_T("NO_DOMAIN")) == 0 )
{
sLogAccount.Format(_T(".\\%s"), m_sLogName);
}
else
{
sLogAccount.Format(_T("%s\\%s"), m_sLogDomain, m_sLogName);
}
if( m_sLogPassword.Compare(_T("NO_PASSWORD")) == 0 )
{
sLogPassword.Empty();
}
else
{
sLogPassword = m_sLogPassword;
}
schService = CreateService(schSCManager,
ServiceName,
DisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpszBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL,
LPCTSTR(sLogAccount), // service account
LPCTSTR(sLogPassword)); // account password
}
else
{
schService = CreateService(schSCManager,
ServiceName,
DisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpszBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // SQL Server dependencies
NULL, // LocalSystem account
NULL); // no password
}
if (schService == NULL)
return false;
// auto restart on crash
SC_ACTION sAction;
sAction.Type = SC_ACTION_RESTART;
sAction.Delay = WAIT_SERVICE_AUTO_RESTART;
SERVICE_FAILURE_ACTIONS sFailureActions;
sFailureActions.dwResetPeriod = INFINITE;
sFailureActions.lpRebootMsg = NULL;
sFailureActions.lpCommand = NULL;
sFailureActions.cActions = 1;
sFailureActions.lpsaActions = &sAction;
::ChangeServiceConfig2(schService, SERVICE_CONFIG_FAILURE_ACTIONS,
&sFailureActions);
CloseServiceHandle(schService);
return true;
}
BOOL UnInstallGatewayService()
{
SC_HANDLE schSCManager;
SC_HANDLE hService;
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
hService=OpenService(schSCManager,ServiceName,SERVICE_ALL_ACCESS);
if (hService == NULL)
return false;
if(DeleteService(hService)==0)
return false;
if(CloseServiceHandle(hService)==0)
return false;
else
return true;
}
VOID GatewayServerShutDown()
{
LBase::UnloadLibraries(LT_KRN | LT_DLG | LT_FIL | LT_IMG | LT_DIS);
ReportServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0,0);
}
HERE IS MY WINDOWS NT SERVICE CODE..PLS HELP