Windows NT service
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?
Reply Reply to author Forward
sriramga...@gmail.com View profile
More options May 29, 2:51 pm
Newsgroups: comp.lang.c++
From: sriramga...@gmail.com
Date: 29 May 2007 02:51:11 -0700
Local: Tues, May 29 2007 2:51 pm
Subject: Re: Windows NT service
Reply | Reply to author | Forward | Print | Individual message | Show
original | Remove | Report this message | Find messages by this
author
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");
....
read more =BB